用列名称相同和不同的混合物连接熊猫数据框列表

时间:2018-10-11 16:52:01

标签: python pandas indexing

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

列表中具有相同列名的数据框具有不同的索引,反之亦然。每个数据帧有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

2 个答案:

答案 0 :(得分:1)

这应该做到:

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()将数据帧列表传递给sort=False,这是熊猫版本0.23.0中的新增功能,因为以前的行为是默认情况下进行IIUC排序(请参阅文档{{3 }})。然后,您可以使用set_index('id')设置级联数据帧的索引。最后,您可以groupby(level=0)按照数据帧的0级索引('id')进行分组,并通过first()获取每一行的第一个非NaN值。

答案 1 :(得分:0)

将具有相同列的df保持在一起,然后应用外部联接

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]
df=pd.concat(list_df, axis = 0)
df2=pd.concat([y,z], axis = 0)
df.join(df2, how='outer')

输出

    a   b   c       d
id              
111 1   2   9.0     10.0
222 3   4   11.0    12.0
333 5   6   NaN     NaN
444 7   8   NaN      NaN