数据框的所有组合,按 ID 分组并按升序元素排序

All combinations of a dataframe, grouped by ID and ordered by ascending elements

我是 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 与 permutations/combination/product 结合使用,但结果总是看起来像这样......(我还没有开始求和部分)

  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.

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

使用 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

与@Erfan 的答案几乎相似,但略有优化:

g = df.groupby("ID")
df["A"] = g["A"].apply(pd.Series.cumsum).str.join(",")
df[["B", "C"]] = g.cumsum()
print(df)

输出:

   ID        A   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