我在一个文件夹中有几个csv文件,我想在一个数据框中打开它们并插入一个带有相关文件名的新列。到目前为止,我已编写以下代码:
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
这为我提供了我想要的数据框,但在新列'文件名'它只列出文件夹中每行的最后一个文件名。我正在寻找要用它关联的csv文件填充的每一行。不只是文件夹中的最后一个文件。
非常感谢对这位新手的任何帮助。
答案 0 :(得分:11)
我认为您需要assign
在loop
中添加新列,同时参数ignore_index=True
已添加到concat
以删除index
中的重复项:
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
答案 1 :(得分:2)
首先,您没有定义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