合并Pandas中重复的行

4

你好,我有一个数据框,如下所示:

   species family     Events       groups
1     SP1      A      10,22           G1
2     SP1      B          7           G2
3     SP1    C,D  4,5,6,1,3  G3,G4,G5,G6
4     SP2      A      22,10           G1
5     SP2    D,C  6,5,4,3,1  G4,G6,G5,G3
6     SP3      C  4,5,3,6,1     G3,G6,G5
7     SP3      E          7           G2
8     SP3      A         10           G1
9     SP4      C       7,22          G12

我希望你能为每个至少在每列中存在一个重复元素的行合并行(species除外)。

例如,我将合并以下行:

species family    Events      groups
SP1      A        10,22       G1
species family    Events      groups
SP2      A        22,10       G1
species family    Events      groups
SP3      A        10          G1

进入

species      family    Events      groups
SP1,SP2,SP3  A         10,22       G1

如果对于每一行都执行相同的操作,那么预期的输出应该是:

species      family    Events      groups
SP1,SP2,SP3  A         10,22       G1
SP1,SP3      B,E       7           G2
SP1,SP2,SP3  C,D       1,3,4,5,6   G3,G4,G6,G5
SP4          C         7,22        G12 

请注意,由于其组未出现在任何其他行中,因此SP4尚未与任何行合并。

有人有什么想法吗?非常感谢您的帮助和时间。

这是字典格式的数据框,它可能有所帮助:

{'species': {1: 'SP1', 2: 'SP1', 3: 'SP1', 4: 'SP2', 5: 'SP2', 6: 'SP3', 7: 'SP3', 8: 'SP3', 9: 'SP4'}, 'family': {1: 'A', 2: 'B', 3: 'C,D', 4: 'A', 5: 'D,C', 6: 'C', 7: 'E', 8: 'A', 9: 'C'}, 'Events': {1: '10,22', 2: '7', 3: '4,5,6,1,3', 4: '22,10', 5: '6,5,4,3,1', 6: '4,5,3,6,1', 7: '7', 8: '10', 9: '7,22'}, 'groups': {1: 'G1', 2: 'G2', 3: 'G3,G4,G5,G6', 4: 'G1', 5: 'G4,G6,G5,G3', 6: 'G3,G6,G5', 7: 'G2', 8: 'G1', 9: 'G12'}}

1
感谢您以复制/粘贴格式发布示例DataFrame。这真的很好,而且很少发生。 - moritz
@moritz 这是我能做的最少的事情,呵呵。 - chippycentra
1个回答

1
这里的技巧是通过逗号分割单元格,将它们处理为集合,最后再拼接回去。这确实是不可向量化的操作,但使用 apply 可以得到(相当)简单的代码。
我首先会为每一行计算一个“包含”组:
g = df['groups'].apply(lambda x: set(x.split(',')))   # explode into sets
# keep the larger set from g containing the current one and make it back a string
g2 = g.apply(lambda s: ','.join(sorted(
    g[g.apply(lambda x: x.issuperset(s))].max())))

使用样例,它给出:
1             G1
2             G2
3    G3,G4,G5,G6
4             G1
5    G3,G4,G5,G6
6    G3,G4,G5,G6
7             G2
8             G1
9            G12
Name: groups, dtype: object

我们现在可以使用它来对数据框进行groupby操作,然后使用集合技巧聚合这些组:
resul = df[['species', 'family', 'Events']].groupby(g2).agg(
    lambda x: ','.join(sorted(set((i for j in x for i in j.split(',')))))
    ).reset_index().reindex(df.columns)

我们得到了预期的结果:
       species family     Events       groups
0  SP1,SP2,SP3      A      10,22           G1
1          SP4      C       22,7          G12
2      SP1,SP3    B,E          7           G2
3  SP1,SP2,SP3    C,D  1,3,4,5,6  G3,G4,G5,G6

你好,我尝试了你的代码,但结果只得到 NaN 值。 - chippycentra
我移除了 .reindex(df.columns) 然后它现在可以工作了。 - chippycentra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接