数据框的所有组合,按 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
我是 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