如何在Python中连接多个数据框?

42
我有多个数据框(超过100个),如何将它们连接起来?
问题在于,我有太多的数据框,不能手动将它们写成列表,就像这样:
>>> cluster_1 = pd.DataFrame([['a', 1], ['b', 2]],
...                    columns=['letter  ', 'number'])


>>> cluster_1
  letter  number
0      a       1
1      b       2


>>> cluster_2 = pd.DataFrame([['c', 3], ['d', 4]],
...                    columns=['letter', 'number'])


>>> cluster_2
  letter  number
0      c       3
1      d       4


>>> pd.concat([cluster_1, cluster_2])
  letter number
0      a       1
1      b       2
0      c       3
1      d       4

我的N个数据框的名称为cluster_1,cluster_2,cluster_3,...,cluster_N。 N的数量可能非常高。

我该如何连接这N个数据框?


我无法手动将它们写入列表中。解决方案与“concat”无关。您需要修复上游流程以生成列表,而不是数百个变量。 - jpp
我不明白在其他帖子中找到的答案如何能帮助我解决我的问题。我可以看出它对于一些小型数据框架是如何工作的,但对于像100个及以上的数据框架来说,我并不认为它适用。 - PParker
3
我已经添加了第二个重复项来帮助你。你需要重新构建逻辑,不要创建可变数量的变量。使用dictlist结构,并与pd.concat一起使用会很好。 - jpp
@jpp 我完全同意。我过去两天一直在尝试做这件事,但是失败了。 - PParker
3个回答

90

我认为你可以把它放进一个列表,然后连接这个列表。在Pandas中,chunk函数已经实现了这种功能。当我使用Pandas的chunk函数时,我经常这样做。

pdList = [df1, df2, ...]  # List of your dataframes
new_df = pd.concat(pdList)
自动创建pdList,假设您的dfs始终以“cluster”开头。
pdList = []
pdList.extend(value for name, value in locals().items() if name.startswith('cluster_'))

1
我该如何避免手动编写pdList列表?假设有100个以上的数据框,这个列表会变得太长。这是我的主要问题。 - PParker
2
嗨,PParker,我已经更新了答案,帮你创建pdList。 - Rui Nian
1
非常感谢。这是一个好的解决方案并且它有效。对于想要尝试它的其他人,你应该考虑首先用pdList=[]初始化pdList。此外,请确保您没有其他数据框以“cluster_”开头,并且它们具有您不想考虑的不同维度。 - PParker
@RuiNian 如果我的列表中包含数据框名称的字符串类型,例如 pdList=['df1','df2','df3',.....],该如何进行连接操作?在这种情况下,使用 pd.concat(pdList) 会出现错误。 - user11580242
我认为你不能这样连接它,因为数据框是内存中的对象,而表示数据框名称的字符串只是字符串。Python无法识别它们是数据框名称。为了克服这个问题,你只需要在列表中删除引号。这样,你的字符串就变成了实际的数据框本身。 - Rui Nian

10

通常情况下,它是这样的:

frames = [df1, df2, df3]
result = pd.concat(frames)

注意:它将自动重置索引。 在此处阅读有关不同类型合并的更多详细信息:这里
对于大量数据框: 如果您有数百个数据框,可以使用for循环创建一个列表(代码片段中的“frames”),具体取决于您是在磁盘上还是在内存中。如果您将其保存在磁盘上,则可以轻松地将所有df保存在一个文件夹中,然后从该文件夹中读取所有文件。
如果您正在内存中生成df,请尝试先将其保存为.pkl

请问您能否更具体一些?您是建议我将所有数据框导出,然后使用循环将它们读入列表中吗? - PParker
2
你现在是如何保存数据框的?它们保存在哪里?或者它们是由你的代码在内存中生成的? - zafrin

4

使用:

pd.concat(your list of column names)

如果想要常规索引:

pd.concat(your list of column names,ignore_index=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接