我正在尝试将CSV文件的文件名作为列名称附加到那些CSV文件中,并且我具有基本的操作思路和代码,只是无法将其集成到当前代码中。这可能很容易。
这就是我读取CSV文件并将其附加到数据框中的方式
big_frame = pd.concat([pd.read_csv(f, skiprows=0 , header=None , index_col= False ,names=col_Names) for f in glob.glob('filepath' + "/*.csv")],
ignore_index=True)
我知道我只需要在代码的某处添加这两行
frame['filename'] = os.path.basename(f)
f.append(frame)
有什么帮助吗?
例如,我有3个CSV文件,每个文件具有相同的列名,如下所示。
Column A Column B Column C
我想将它们全部合并到大数据框中,并在新列中添加原始CSV文件名称,例如
Column A Column B Column C filename
file 1
file 2
file 3
答案 0 :(得分:1)
您可以使用df.assign,也可以使用Path.glob模块中的pathlib打开文件。
from pathlib import Path
big_frame = pd.concat(
[pd.read_csv(file.name, skiprows=0, header=None, index_col=False, names=col_Names).assign(filname=file.name)
for file in Path('filepath').glob('*.csv')],
ignore_index=True)
答案 1 :(得分:0)
在读取read_csv
之后使用DataFrame.assign()
来添加一列:
big_frame = pd.concat([pd.read_csv(f, ...).assign(filename=os.path.basename(f))
for f in glob.glob('filepath' + "/*.csv")],
ignore_index=True)
({...
指向read_csv
的所有其他参数。)
其他更改:
pd.concat()
接受生成器,因此您无需使用列表理解即可创建df的列表。它只使用了比需要的更多的内存,并且由于您正在读取磁盘,因此无法提高性能。并且当您使用生成器表达式时,它将需要额外的括号。注意可读性的额外缩进:
big_frame = pd.concat((pd.read_csv(f, ...).assign(filename=os.path.basename(f))
for f in glob.glob('filepath' + "/*.csv")),
ignore_index=True)
对于globo,请使用os.path.join(因为filepath
是变量名,而不是实际路径:
glob.glob(os.path.join(filepath, '*.csv'))
或者使用pathlib.Path
和Path.glob
作为死角的答案。
具有所有参数:
big_frame = pd.concat((pd.read_csv(f,
skiprows=0,
header=None,
index_col=False,
names=col_Names,
).assign(filename=os.path.basename(f))
for f in glob.glob(os.path.join(filepath, '*.csv'))
),
ignore_index=True)
顺便说一句,我在批量读取CSV时执行此操作,除了我不只使用基名,因为我想要包含文件的完整路径。从不同的源/目录读取相同格式的CSV时特别有用。