python - 如何在具有许多列的 pandas 数据框中生成所有可能的列组合?

标签 python pandas python-itertools

我有以下数据框:

   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/

相关文章:

python - 为什么子类化 DataFrame 会改变原始对象?

Python xlsxwriter write_rich_string 并突出显示

python - 如何生成计数器的所有子集?

python - 在不迭代的情况下向量化 Pandas DataFrame 上的乘法和字典映射?

python - 通过每个选择 2 个元素来合并两个列表

python - Itertools.product 中索引处的元素

python - Pandas Series.from_records?

python - atm 取款时出现错误消息,输入金额大于或小于帐户余额时无法正常运行

python - matplotlib:断轴和不均匀缩放

python - 从 if else 语句创建新列