1つのフォルダーに複数のcsvファイルがあり、それらをすべて1つのデータフレームで開いて、関連付けられたファイル名で新しい列を挿入します。これまでのところ、私は以下をコーディングしました:
import pandas as pd
import glob, os
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('path/*.csv'))))
df['filename']= os.path.basename(csv)
df
これにより、必要なデータフレームが得られますが、新しい列「filename」には、フォルダー内のすべての行の最後のファイル名のみがリストされます。関連付けられたcsvファイルが入力される各行を探しています。フォルダーの最後のファイルだけではありません。
この初心者のための支援は大歓迎です。
assign
に新しい列を追加するには、 loop
が必要だと思います。また、パラメータignore_index=True
が concat
に追加され、index
の重複を削除します。
テスト用のファイルは a.csv 、 b.csv 、 c.csv です。
import pandas as pd
import glob, os
files = glob.glob('files/*.csv')
print (files)
['files\\a.csv', 'files\\b.csv', 'files\\c.csv']
files = glob.glob('files/*.csv')
print (files)
['files\\a.csv', 'files\\b.csv', 'files\\c.csv']
df = pd.concat([pd.read_csv(fp).assign(New=os.path.basename(fp)) for fp in files])
print (df)
a b c d New
0 0 1 2 5 a.csv
1 1 5 8 3 a.csv
2 0 9 6 5 b.csv
3 1 6 4 2 b.csv
4 0 7 1 7 c.csv
5 1 3 2 6 c.csv
files = glob.glob('files/*.csv')
df = pd.concat([pd.read_csv(fp).assign(New=os.path.basename(fp).split('.')[0]) for fp in files])
print (df)
a b c d New
0 0 1 2 5 a
1 1 5 8 3 a
2 0 9 6 5 b
3 1 6 4 2 b
4 0 7 1 7 c
5 1 3 2 6 c
まず、csv変数が定義されていません。
しかし、とにかく、最後のcsvを使用して最後のファイルに設定されるため、この動作は理にかなっています。理想的には、もう一度globを使用してすべてのファイル名を取得し、それを新しい列として設定できます。
#this is a Python list containing filenames
csvs = glob.glob(os.path.join('path/*.csv'))
#now set the csv into a pd series
csv_paths = pd.Series(csvs)
df['file_name'] = csv_paths.values