86272


このようなcsvファイルに対して、9列目=1.00 のときは3列目を出力し、9列目=0.00 のときは0またはスキップという処理を行いたいです。  
excelで行うと `=IF(J2=1,D2,"")` という処理になります。  
for文の中でif文を使う部分で躓いております。

[![csv](https://i.stack.imgur.com/DTgdh.png)](https://i.stack.imgur.com/DTgdh.png)

[code]

    import csv
    
    with open('/Users/abc/Desktop/sample.csv', "r") as df1:
        csv.reader(df1)
        for row in csv.reader(df1):
            if row[9] == 1:
                con.append(row[3])
            elif row[9] == 0:
                con.append(0)
    
[/code]


CC BY-SA 4.0
2022-02-11T08:51:29.007
86269
2022-03-15T11:40:35.597
2022-02-12T05:12:29.633
3060
51382
question
python csv
CSV から条件を満たした数値だけを抽出したい


[csv.reader](https://docs.python.org/ja/3/library/csv.html#csv.reader)は文字列(str)として値を読み込むのが原因だと思います。(下記はリンク先抜粋)

> csv ファイルから読み込まれた各行は、文字列のリストとして返されます。QUOTE_NONNUMERIC
> フォーマットオプションが指定された場合を除き、データ型の変換が自動的に行われることはありません
> (このオプションが指定された場合、クォートされていないフィールドは浮動小数点数に変換されます)。

文字列と数値をそのまま比較すると正しく比較できず常に`False`となるので、適切にキャストをしてください。

[code]

    import csv
    
    with open('sample.csv', "r") as df1:
        con = []
        csv.reader(df1)
        for row in csv.reader(df1):
            if int(row[9]) == 1:
                con.append(row[3])
            elif int(row[9]) == 0:
                con.append(0)
        print(con)
    
[/code]


CC BY-SA 4.0
2022-02-11T09:07:15.280
86270
2022-02-11T09:07:15.280
9820
86269
answer


pandas 使う方法もあります  
たいていは数値化してくれるけど, 時々 型指定の必要がある場合も。  
また, pandasは 全体的に 素の Pythonとは異なる部分もあり, 人によってはオススメだけど, 合わない人には合わない

(処理の前半は CSVの生成)

[code]

    import pandas as pd
    import numpy as np
    import io
    cnt = 10
    rng = np.random.default_rng()
    with io.StringIO() as fp:
        pd.DataFrame({
            'A': rng.integers(150, size=cnt),
            'B': rng.random(size=cnt) *20,
            'C': np.zeros(cnt),
            'D': rng.choice(a=[0,1], size=cnt),
            }).to_csv(fp, index=False)
    
        fp.seek(0)
        df = pd.read_csv(fp)    # CSV読み込み, ヘッダー付き
    
    df['val'] = df[df['D'] == 1]['B']   # 該当する項目 'D'が 1の場合は, 'B'の項目をセット
    df.style.hide(axis='index').highlight_null(null_color='yellow')
    
[/code]

[![結果](https://i.stack.imgur.com/neSao.png)](https://i.stack.imgur.com/neSao.png)

* * *

#### 追記

別解(？)として記したけれど, pandas使うのなら, 読んでおくとよいかもなドキュメントあります。

  * Cookbook: <https://pandas.pydata.org/pandas-docs/stable/user_guide/cookbook.html>
  * Cheat Sheet: <https://github.com/pandas-dev/pandas/tree/main/doc/cheatsheet>

`IF()` の処理について …

[code]

    excelで行うと =IF(J2=1,D2,"") という処理になります。
    
[/code]

(上記 Cookbook内に記載あり)

[code]

    # pandasで同様な処理は, if-then…
    df.loc[df.AAA >= 5, "BBB"] = -1
    
    # if-then-else 形式の処理は, NumPyで指定可能
    df["logic"] = np.where(df["AAA"] > 5, "high", "low")
    
[/code]


CC BY-SA 4.0
2022-02-11T12:42:36.893
86272
2022-03-15T11:40:35.597
2022-03-15T11:40:35.597
43025
43025
86269
answer