读取多个 csv 文件并将文件名添加为 pandas 中的新列

Posted

技术标签:

【中文标题】读取多个 csv 文件并将文件名添加为 pandas 中的新列【英文标题】:Read multiple csv files and Add filename as new column in pandas 【发布时间】:2017-08-03 01:25:57 【问题描述】:

我在一个文件夹中有多个 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 文件。不仅仅是文件夹中的最后一个文件。

非常感谢对这个新手的任何帮助。

【问题讨论】:

什么是csv - 没有定义变量csv 【参考方案1】:

首先,您没有定义 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

【讨论】:

我得到ValueError: Length of values does not match length of index,因为每个文件都有更多的一行数据。【参考方案2】:

我认为您需要assign 来在loop 中添加新列,还将参数ignore_index=True 添加到concat 以删除index 中的重复项:

测试文件为a.csv、b.csv、c.csv。

import pandas as pd
import glob, os


files = glob.glob('samples_for_so/*.csv')
print (files)
#['samples_for_so\\a.csv', 'samples_for_so\\b.csv', 'samples_for_so\\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
0  0  9  6  5  b.csv
1  1  6  4  2  b.csv
0  0  7  1  7  c.csv
1  1  3  2  6  c.csv

files = glob.glob('samples_for_so/*.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 文件并将文件名添加为 pandas 中的新列的主要内容,如果未能解决你的问题,请参考以下文章

pandas处理csv文件时,添加索引 2019-02-27

将多个csv文件导入pandas并合并到一个DataFrame中

按创建日期过滤多个 csv 文件并连接成一个 pandas DataFrame

分块读取 Pandas 中的多个 CSV 文件

Python Pandas - 读取包含多个表的 csv 文件

如何使用包含引号并使用多个分隔符的 pandas 读取 CSV 文件