【问题标题】:Concatenate List of Dataframes and Include Original Dataframe Names as Keys连接数据框列表并包含原始数据框名称作为键
【发布时间】:2021-09-10 18:37:24
【问题描述】:

我有创建具有相同结构的数据框列表的代码。我的愿望是将所有这些数据帧附加在一起,但在新数据帧中添加一列,以标识该行最初来自哪个数据帧。

我很容易在数据框列表中添加了:

import pandas as pd
df_rosters = pd.concat(list_of_rosters)

但是,我无法弄清楚如何添加具有原始数据框名称或索引的列。我发现了一堆建议使用 keys 参数的示例;但是每个示例都有硬编码的键。我的列表的大小在不断变化,所以我需要弄清楚如何动态添加键。

提前致谢!

【问题讨论】:

  • 在 PyCharm 中,它允许我“复制名称”列表中的每个 DataFrame。但是名称只是 ['00', '01', ... 'n'],所以在连接的 DataFrame 中区分它们(索引?)的任何方法都可以。
  • 类似pd.concat({f'{i:02d}': d for i, d in enumerate(list_of_rosters)})?
  • 感谢您的建议!这非常接近我正在寻找的内容,但我希望此列在导出(到 CSV)时保持不变。您给我的代码在 IDE DataFrame 查看器中将索引列显示为“00/[index], 01/[index]...n[index]”,但是当我导出它时,该列不在 CSV 中.
  • pd.concat(d.assign(df_name=f'{i:02d}') for i, d in enumerate(list_of_rosters)) ?

标签: python pandas dataframe key concatenation


【解决方案1】:

让我们assign 为列表中的每个 DataFrame 设置一个指标列。 (名称可以与 DataFrame 列表一起压缩或由 enumerate 之类的东西创建):

enumerate

pd.concat(d.assign(df_name=f'{i:02d}') for i, d in enumerate(list_of_rosters))

   0  1 df_name
0  4  7      00
1  7  1      00
2  9  5      00
0  8  1      01
1  1  8      01
2  2  6      01

或者zip:

pd.concat(d.assign(df_name=name)
          for name, d in zip(['name1', 'name2'], list_of_rosters))

   0  1 df_name
0  4  7   name1
1  7  1   name1
2  9  5   name1
0  8  1   name2
1  1  8   name2
2  2  6   name2

设置:

import numpy as np
import pandas as pd

np.random.seed(5)
list_of_rosters = [
    pd.DataFrame(np.random.randint(1, 10, (3, 2))),
    pd.DataFrame(np.random.randint(1, 10, (3, 2)))
]

list_of_rosters:

[   0  1
0  4  7
1  7  1
2  9  5,    
    0  1
0  8  1
1  1  8
2  2  6]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 2019-08-11
    • 2021-03-29
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2021-05-02
    • 2016-11-02
    相关资源
    最近更新 更多