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