我有一个包含分组变量的Pandas数据帧。我想根据其中一列的内容将每个组与其他数据帧合并。因此,例如,我有一个数据帧dfA,可以定义为:
dfA = pd.DataFrame({'a':[1,2,3,4,5,6],
'b':[0,1,0,0,1,1],
'c':['a','b','c','d','e','f']})
a b c
0 1 0 a
1 2 1 b
2 3 0 c
3 4 0 d
4 5 1 e
5 6 1 f
另外两个数据框dfB和dfC包含一个公共列(' a')和一个额外的列(' d'),可以定义为:
dfB = pd.DataFrame({'a':[1,2,3],
'd':[11,12,13]})
a d
0 1 11
1 2 12
2 3 13
dfC = pd.DataFrame({'a':[4,5,6],
'd':[21,22,23]})
a d
0 4 21
1 5 22
2 6 23
我希望能够根据专栏b' b'来分割dfA。并将其中一个组与dfB合并,将另一个组与dfC合并,以生成如下所示的输出:
a b c d
0 1 0 a 11
1 2 1 b 12
2 3 0 c 13
3 4 0 d 21
4 5 1 e 22
5 6 1 f 23
在这个简化版本中,我可以连接dfB和dfC并与dfA合并而不分成组,如下所示:
dfX = pd.concat([dfB,dfC])
dfA = dfA.merge(dfX,on='a',how='left')
print(dfA)
a b c d
0 1 0 a 11
1 2 1 b 12
2 3 0 c 13
3 4 0 d 21
4 5 1 e 22
5 6 1 f 23
然而,在现实世界中,较小的数据帧将从多个不同的复杂源生成;生成数据帧并预先组合成单个数据帧可能不可行,因为列上可能存在将用于合并数据帧的重叠数据(但如果可以基于分组变量拆分数据帧,则可以避免这种情况)。是否可以使用Pandas groupby()方法来代替?我在考虑以下内容(它不起作用,也许是因为我没有正确地将这些组合成一个新的数据帧):
grouped = dfA.groupby('b')
for name, group in grouped:
if name == 0:
group = group.merge(dfB,on='a',how='left')
elif name == 1:
group = group.merge(dfC,on='a',how='left')
任何想法都会受到赞赏。
答案 0 :(得分:3)
这将修复你的代码
l=[]
grouped = dfA.groupby('b')
for name, group in grouped:
if name == 0:
group = group.merge(dfB,on='a',how='left')
elif name == 1:
group = group.merge(dfC,on='a',how='left')
l.append(group)
pd.concat(l)
Out[215]:
a b c d
0 1 0 a 11.0
1 3 0 c 13.0
2 4 0 d NaN
0 2 1 b NaN
1 5 1 e 22.0
2 6 1 f 23.0