熊猫加入3个dfs

时间:2017-12-12 00:17:09

标签: python pandas

我有3个dfs,我不知道如何合并。

DF1:

ID Name XCount
111 aaa 3
222 bbb 2
333 ccc 3

DF2:

ID Name YCount
111 abc 3
222 bbb 2
444 ddd 1

DF3:

ID Name YCount 
111 aaa 2
222 bbb 3
555 eee 4

目标:

ID Name XCount YCount Zcount
111 aaa 3 NA 2
111 abc NA 3 NA
222 bbb 2 2 3
333 ccc 2 NA NA
444 ddd NA 1 NA
555 eee NA NA 4

我尝试连接,但ID和名称字段不匹配。

感谢!!!

2 个答案:

答案 0 :(得分:3)

您需要使用合并

df1.merge(df2, on = ['ID', 'Name'],how = 'outer').merge(df3,  on = ['ID', 'Name'], how = 'outer')

    ID  Name    XCount  YCount_x    YCount_y
0   111 aaa     3.0     NaN         2.0
1   222 bbb     2.0     2.0         3.0
2   333 ccc     3.0     NaN         NaN
3   111 abc     NaN     3.0         NaN
4   444 ddd     NaN     1.0         NaN
5   555 eee     NaN     NaN         4

答案 1 :(得分:1)

你可以使用concat和groupby:df = pd.concat(pd.DataFrame(i) for i in (data1,data2,data3)).groupby(['ID','Name']).sum().reset_index()来完成。完整示例如下:

康卡特会把事情放在彼此之上。

import pandas as pd

data1 = {'ID': {0: 111, 1: 222, 2: 333},
 'Name': {0: 'aaa', 1: 'bbb', 2: 'ccc'},
 'XCount': {0: 3, 1: 2, 2: 3}}

data2 = {'ID': {0: 111, 1: 222, 2: 444},
 'Name': {0: 'abc', 1: 'bbb', 2: 'ddd'},
 'YCount': {0: 3, 1: 2, 2: 1}}

data3 = {'ID': {0: 111, 1: 222, 2: 555},
 'Name': {0: 'aaa', 1: 'bbb', 2: 'eee'},
 'ZCount': {0: 2, 1: 3, 2: 4}}

df = pd.concat(pd.DataFrame(i) for i in (data1,data2,data3))

print(df)返回:

    ID Name  XCount  YCount  ZCount
0  111  aaa     3.0     NaN     NaN
1  222  bbb     2.0     NaN     NaN
2  333  ccc     3.0     NaN     NaN
0  111  abc     NaN     3.0     NaN
1  222  bbb     NaN     2.0     NaN
2  444  ddd     NaN     1.0     NaN
0  111  aaa     NaN     NaN     2.0
1  222  bbb     NaN     NaN     3.0
2  555  eee     NaN     NaN     4.0

如果我们现在执行groupby:

df.groupby(['ID','Name']).sum().reset_index()

我们得到:

    ID Name  XCount  YCount  ZCount
0  111  aaa     3.0     NaN     2.0
1  111  abc     NaN     3.0     NaN
2  222  bbb     2.0     2.0     3.0
3  333  ccc     3.0     NaN     NaN
4  444  ddd     NaN     1.0     NaN
5  555  eee     NaN     NaN     4.0