首页 > 解决方案 > 连接具有相同和不同列名的 pandas 数据帧列表

问题描述

我有一个要合并到一个数据框中的数据框列表

具有相同列名的列表中的数据框具有不同的索引,反之亦然。每个数据框有 1 行 80 列,列表的总长度为 8,000 个数据框。

这是我的数据框列表的缩小示例:

import pandas as pd

u = pd.DataFrame(data=[[1, 2, '111']], columns = ['a', 'b', 'id'])
u = u.set_index('id')

v = pd.DataFrame(data=[[3, 4, '222']], columns = ['a', 'b', 'id'])
v = v.set_index('id')

w = pd.DataFrame(data=[[5, 6, '333']], columns = ['a', 'b', 'id'])
w = w.set_index('id')

x = pd.DataFrame(data=[[7, 8, '444']], columns = ['a', 'b', 'id'])
x = x.set_index('id')

y = pd.DataFrame(data=[[9, 10, '111']], columns = ['c', 'd', 'id'])
y = y.set_index('id')

z = pd.DataFrame(data=[[11, 12, '222']], columns = ['c', 'd', 'id'])
z = z.set_index('id')

list_df = [u, v, w, x, y, z]

如何创建一个如下所示的合并表:

id    a     b    c    d
--------------------------
111   1.0   2.0  9.0  10.0
222   3.0   4.0  11.0 12.0
333   5.0   6.0  NaN  NaN
444   7.0   8.0  NaN  NaN

目前,由于我列表的大小,我一直在使用pd.concat. 但是,pd.concat(list_df, axis = 0)给出:

id    a     b    c    d
--------------------------
111   1.0   2.0  NaN  NaN
222   3.0   4.0  NaN  NaN
333   5.0   6.0  NaN  NaN
444   7.0   8.0  NaN  NaN
111   NaN   NaN  9.0  10.0
222   NaN   NaN  11.0 12.0

pd.concat(list_df, axis = 1)给出:

id    a    b    a    b    a    b    a    b    c    d    c    d
----------------------------------------------------------------
111   1.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN  9.0  10.0 NaN  NaN
222   NaN  NaN  3.0  4.0  NaN  NaN  NaN  NaN  NaN  NaN  11.0 12.0
333   NaN  NaN  NaN  NaN  5.0  6.0  NaN  NaN  NaN  NaN  NaN  NaN 
444   NaN  NaN  NaN  NaN  NaN  NaN  7.0  8.0  NaN  NaN  NaN  NaN

标签: pythonpandasindexing

解决方案


这应该这样做:

pd.concat([u, v, w, x, y, z], sort=False).set_index('id').groupby(level=0).first()

产量:

       a    b     c     d
id                       
111  1.0  2.0   9.0  10.0
222  3.0  4.0  11.0  12.0
333  5.0  6.0   NaN   NaN
444  7.0  8.0   NaN   NaN

请注意,您不需要set_index()单独为每个数据帧。

解释:

您可以将数据框列表传递给pd.concat()with 关键字sort=False,这是 pandas 版本 0.23.0 中的新功能,因为之前的行为是默认 IIUC 排序(请参阅此处的文档)。然后,您可以使用set_index('id')设置连接数据帧的索引。最后,您可以groupby(level=0)按数据帧的 0 级索引 ( 'id') 对数据框进行分组,并通过 为每行获取第一个非 NaN 值first()


推荐阅读