web-dev-qa-db-ja.com

複数のcsvファイルを読み取り、pandasの新しい列としてファイル名を追加します

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ファイルが入力される各行を探しています。フォルダーの最後のファイルだけではありません。

この初心者のための支援は大歓迎です。

11
amwade2

assignに新しい列を追加するには、 loop が必要だと思います。また、パラメータignore_index=Trueconcat に追加され、indexの重複を削除します。

テスト用のファイルは a.csvb.csvc.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
13
jezrael

まず、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
2
Abid Hasan