首页 > 解决方案 > 数据框的所有组合,按 ID 分组并按升序元素排序

问题描述

我是 Python 新手,并尝试根据列的所有可能结果创建输出,同时始终从该 ID 上的第一个结果开始。这是一个类似于我正在使用的数据的示例数据框:

    ID A B C
    1  a 1 10
    1  b 3 40
    1  c 2 20
    2  a 3 90
    2  b 1 10
    2  c 4 60
    2  d 8 100

我想按 ID 分组,以创建一个输出,其中 a 列是基于 A 的所有可能结果,而 B 和 C 是这些组合的总和。

    ID  Combo  B  C
    1     a    1  10
    1    a,b   4  50
    1   a,b,c  6  70
    2     a    3  90
    2    a,b   4  100
    2   a,b,c  8  160
    2  a,b,c,d 16 260

我已经尝试在 ID 上使用 groupby 以及排列/组合/产品,但是结果总是看起来像这样......(我还没有开始求和部分)

  ID  Combo  B C
   1  a,b,c  x x
   1  a,c,b  x x
   1  b,a,c  x x 
   1  c,a,b  x x
   1  b,c,a  x x 
   1  c,b,a  x x
   etc.

任何人都可以在这里指出我正确的方向吗?我认为组合是正确的方法。似乎我发现的每个问题总是想要上面的格式,而不是针对我正在寻找的输出,所以我找不到我需要的答案。

标签: pythonpandasdataframepermutation

解决方案


GroupBy与字符串和数字列的累积和一起使用:

df['A'] = (
    df.groupby('ID')
    .apply(lambda x: x['A'].add(',').cumsum().str.strip(','))
    .reset_index(0, drop=True)
)
df[['B', 'C']] = df.groupby('ID').cumsum()
df = df.rename(columns={'A': 'Combo'})
   ID    Combo   B    C
0   1        a   1   10
1   1      a,b   4   50
2   1    a,b,c   6   70
3   2        a   3   90
4   2      a,b   4  100
5   2    a,b,c   8  160
6   2  a,b,c,d  16  260

推荐阅读