74015


やりたいこと：  
csvファイルのデータを抽出し、B列に空白があれば除外した後に文字列を追加します。

CSVのデータ

[code]

    A       B      C       D
    アメリカ  1234   空白    ワシントン
    カナダ　　空白　 バンクーバー空白
    日本    2345　　東京     空白
    イタリア　 空白　　空白     空白
    
[/code]

①抽出したいデータ下記のように表示します。

[code]

    1234
    2345
    
[/code]

②最終的にこちらの形式でデータを加工して表示したいです。

[code]

    Number/1234
    Number/2345
    
[/code]

こちらのコードを記載しましたが下記のように表示されます。

[code]

    import os
    import json
    import pandas as pd
    
    #CSVファイルの読み込み
    df1 = pd.read_csv('test.csv',encoding='utf_8_sig')
    
    #B列だけ読み込み
    df_i =  df1[["B"]] 
    
    #空白を除外
    df_i = df1[df1["B"].str.contains("",na=False)]
    
    #1行ごとをループさせて空白を含まない
    for j in range(len(df_i)):
     a =''.join([f"{data}"for column,data in df_i.iloc[j].iteritems()])
    
     s ='Number/'+a
     print(s)
    
[/code]

出力結果

[code]

    print(s)
    
    Number/アメリカ1234nanワシントンnan....
    
[/code]

わかる方いらっしゃいましたらご教示願います。  
お手数ですが、宜しくお願いいたします。


CC BY-SA 4.0
2021-02-15T08:31:48.110
74010
2021-02-15T16:20:43.153
2021-02-15T16:20:43.153
3060
18859
question
python csv
CSVデータを抽出【空白除外】、データ加工について


CSVということですが, CSVの形式ではないので, CSVの間違いなのかコードの問題なのか分かりません。  
とりあえず以下のような CSVを用意して試してみました

[code]

    A,B,C,D
    アメリカ,1234,,ワシントン
    カナダ,,バンクーバー,
    日本,2345,東京,
    イタリア,
    
[/code]

プログラムはこんな感じ

[code]

    import pandas as pd
    
    df = pd.read_csv(csvf)
    for c in df.B.dropna():
      print(f'Number/{int(c)}')
    
[/code]

以下出力

[code]

    Number/1234
    Number/2345
    
[/code]


CC BY-SA 4.0
2021-02-15T09:12:04.203
74011
2021-02-15T09:12:04.203
43025
74010
answer


[pandas.read_csv](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.read_csv.html#pandas-read-csv) の `converters`
keyword を使う方法です。

[code]

    import pandas as pd
    
    s = '\n'.join(filter(None,
      pd.read_csv(
        'test.csv',
        usecols=['B'], encoding='utf_8_sig', squeeze=True,
        converters={
          'B': lambda x: 'Number/'+x if x else x
        })))
    
    print(s)
    =>
    Number/1234
    Number/2345
    
[/code]


CC BY-SA 4.0
2021-02-15T11:14:13.520
74015
2021-02-15T11:30:11.720
2021-02-15T11:30:11.720
74010
answer


元のデータが全角空白や半角空白で区切られています。  
データを修正することが、一番優先されるでしょう。

仮に半角空白区切りなら、

[code]

    pd.read_csv('test.csv',delim_whitespace=True)
    
[/code]

タブ区切りなら、

[code]

    pd.read_csv('test.csv',delimiter='\t')
    
[/code]

といった感じで、カンマ区切り（csv)以外も、自分が指定して、読み込めるようにはなっています。  
ただ例にあるようなデータのように、区切り文字が全角半角の空白が混在する環境までは、正しく動作することは期待できないのです。  
自分で読み込み部分を実装するか、元のデータを修正してから作業するか、ということになります。  
それによって、アドバイスも変わってきます。

下記のスクリプトは、半角、全角の空白をどちらも区切り文字とみなしカンマ(,)に置き換えます。  
また'空白'という２文字が必要なデータなのか不明ですが、取り除く処理も追加しています。  
項目数やデータの中身、の関係で、そのまま残す必要があるなら残すで良いかと思います。

[code]

    #!/usr/bin/env python3
    #-*- coding: utf-8 -*-
    
    import re
    import sys
    
    #全角、半角空白を置き換えるためのパターン
    #どんな環境でも動くかは、把握できかねます。
    pattern=re.compile(r'[ 　]+')
    #'空白'という文字列を削除するためのパターン
    pattern2=re.compile(r'空白')
    
    #第一引数のファイル名を変換します。
    ifile=sys.argv[1]
    
    #新しいファイル名を元のファイル名に-to-csv.csvに変換します。元のファイル名の拡張子は消しません。
    #ファイル名が衝突した場合は上書きされます。
    #改行コードが特殊なケースは想定しません。
    
    ofile=open(ifile+'-to-csv.csv','tw')
    with open(ifile,'tr') as fin:
        #一行ずつ処理します。
        for iline in fin:
            #全角空白、半角空白をカンマに置き換える。
            #動作保証はできません。
            buf=pattern.sub(',',iline)
            #さらに空白、という文字列を取り除く。不要な処理なら削除してください。
            buf=pattern2.sub('',buf)
            #ファイルへの書き込み
            ofile.write(buf)
        ofile.close()
    
[/code]


CC BY-SA 4.0
2021-02-15T12:30:59.847
74018
2021-02-15T16:20:19.063
2021-02-15T16:20:19.063
3060
43957
74010
answer