【问题标题】:multiple CSV into one and file name as a column name in Pandas在 Pandas 中,多个 CSV 合为一个,文件名作为列名
【发布时间】:2020-01-25 05:55:57
【问题描述】:

我有一个目录,里面有一百个 CSV 文件。其中一个 CSV 文件如下所示;

Time    ID
09:00   A
..      ..

我想将所有 csv 加入一个包含文件名的数据帧中(由轴 = 1 附加) 我使用了这段代码:

files = glob.glob(data/*.csv')
df = pd.concat([pd.read_csv(fp).assign(File=os.path.basename(fp).split('.')[0]) for fp in files], axis=1)
df.to_csv('new.csv')
df

我得到的结果是这样的

Time    ID  File  Time  ID  File    ..
09:00   A   01    09:00 B   02      ..
..      ..  ..    ..    ..  ..      ..

我想以文件名作为列名加入ID列名。我的预期结果如下所示:

Time    01_ID   Time    02_ID   ..
09:00   A       09:00   B       ..
..      ..      ..      ..      ..

【问题讨论】:

  • pandas.assign(col=...) 将单词 col 视为新列的 字符串 名称,而不是名为 col 的变量。您可以通过将带有 ** 的字典传递给它来绕过该问题,但它认为在列表理解中不可能做到这一点。 stackoverflow.com/questions/39767718/…

标签: python pandas


【解决方案1】:

您可以先使用字典理解:

comp = {os.path.basename(fp).split('.')[0]: pd.read_csv(fp) for fp in files}
df = pd.concat(comp, axis=1)

然后在列表推导中过滤转换MultiIndex in columns

df.columns = [f"{a}_{b}" if b == 'ID' else b for a, b in df.columns]
print (df)
    Time 01_ID   Time 02_ID
0  09:00     A  09:00     B

df.to_csv('new.csv')

编辑:更好的解决方案是创建唯一的列名:

df.columns = df.columns.map('_'.join)
print (df)
  01_Time 01_ID 02_Time 02_ID
0   09:00     A   09:00     B

【讨论】:

  • 感谢 cmets。仅特定列或仅一列(并非所有列都包含文件名)怎么样?
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多