我有以下数据框:
A B C
0 1 3 3
1 1 9 4
2 4 6 3
我想创建这些列的所有可能的唯一组合而不重复,这样我最终会得到一个包含以下数据的数据框:A、B、C、A+B、A+ C、B+C、A+B+C。 我不想以任何组合重复任何列,例如A+A+B+C 或 A+B+B+C。
我还希望数据框中的每一列都标有相关变量名称(例如,对于 A + B 的组合,列名称应为“A_B”)
这是所需的数据框:
A B C A_B A_C B_C A_B_C
0 1 1 4 2 5 5 6
1 3 9 6 12 9 15 18
2 3 4 3 7 6 7 10
使用 itertools 只需 3 个变量,这相对容易,我使用了以下代码来做到这一点:
import pandas as pd
import itertools
combos_2 = pd.DataFrame({'{}_{}'.format(a, b):
df[a] + df[b]
for a, b in itertools.combinations(df.columns, 2)})
combos_3 = pd.DataFrame({'{}_{}_{}'.format(a, b, c):
df[a] + df[b] + df[c]
for a, b, c in itertools.combinations(df.columns, 3)})
composites = pd.concat([df, combos_2, combos_3], axis=1)
但是,我不知道如何以 pythonic 方式扩展此代码以解释具有更多列数的 DataFrame。有没有办法让下面的代码更加Python化并扩展它以用于大量列?或者有更有效的方法来生成组合吗?
最佳答案
我们需要首先根据列创建组合
,然后创建数据框
from itertools import combinations
input = df.columns
output = sum([list(map(list, combinations(input, i))) for i in range(len(input) + 1)], [])
output
Out[21]: [[], ['A'], ['B'], ['C'], ['A', 'B'], ['A', 'C'], ['B', 'C'], ['A', 'B', 'C']]
df1=pd.DataFrame({'_'.join(x) : df[x].sum(axis=1 ) for x in output if x !=[]})
df1
Out[22]:
A B C A_B A_C B_C A_B_C
0 1 3 3 4 4 6 7
1 1 9 4 10 5 13 14
2 4 6 3 10 7 9 13
关于python - 如何在具有许多列的 pandas 数据框中生成所有可能的列组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895077/