是否可以使用groupby拆分Pandas数据帧,并将每个组合并为单独的数据帧

问题描述 投票:1回答:1

我有一个包含分组变量的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'拆分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')

任何想法将不胜感激。

python python-3.x pandas pandas-groupby
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.