Pandas groupby:将不同的值合并到另一列中

时间:2019-07-15 00:20:26

标签: python pandas pandas-groupby

我需要按列子集进行分组,并计算其值的不同组合数。但是,还有其他列可能具有也可能没有不同的值,因此我想以某种方式将此信息保留在输出中。这是一个示例:

gb1          gb2         text1   text2
bebop        skeletor    blue    fisher
bebop        skeletor    blue    wright
rocksteady   beast_man   orange  haldane
rocksteady   beast_man   orange  haldane
tokka        kobra_khan  green   lande
tokka        kobra_khan  red     arnold

要按gb1gb2分组。

这是我需要的:

gb1          gb2         count   text1        text2
bebop        skeletor    2       blue         fisher, wright
rocksteady   beast_man   2       orange       haldane
tokka        kobra_khan  2       green, red   lande, arnold

除了处理text1text2列之外,我已经完成了所有工作。

谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用

进行检查
s=df.assign(count=1).groupby(['gb1','gb2']).agg({'count':'sum','text1':lambda x : ','.join(set(x)),'text2':lambda x : ','.join(set(x))}).reset_index()
s
          gb1         gb2  count      text1          text2
0       bebop    skeletor      2       blue  wright,fisher
1  rocksteady   beast_man      2     orange        haldane
2       tokka  kobra_khan      2  green,red   lande,arnold

答案 1 :(得分:2)

您可以结合使用applytransform

如果df是您的原始数据帧:

def combine(xx):
    dd = xx.transform(lambda x : ','.join(set(x)))
    dd['count'] = len(xx)
    return dd

ddf = df.groupby(['gb1', 'gb2']).apply(combine)

在示例数据帧中,ddf为:

                           text1          text2  count
gb1        gb2                                        
bebop      skeletor         blue  fisher,wright      2
rocksteady beast_man      orange        haldane      2
tokka      kobra_khan  red,green   lande,arnold      2