Python 生成任意2列的所有二次组合

Python 生成任意2列的所有二次组合,python,pandas,Python,Pandas,我有一个DataFramedf,其中列C1,C2,C3,C4。我想要一个新的DataFrame,其中表示一列与另一列相乘的每一个组合。这意味着在4列开始的情况下,我们应该有sum(4,3,2,1)=10列。此外,列应标记为多索引,其中每个级别标识一个被乘以的原始列 所以如果 我希望df_quad的df_quad看起来像: C1 C2 C3 C4 C1 C2 C3 C4 C2 C3 C4 C3 C4 C4 0 6

我有一个
DataFrame
df
,其中列
C1
C2
C3
C4
。我想要一个新的
DataFrame
,其中表示一列与另一列相乘的每一个组合。这意味着在4列开始的情况下,我们应该有
sum(4,3,2,1)=10列。此外,列应标记为
多索引
,其中每个级别标识一个被乘以的原始列

所以如果

我希望df_quad的
df_quad
看起来像:

   C1              C2          C3      C4
   C1  C2  C3  C4  C2  C3  C4  C3  C4  C4
0  64   0  40  48   0   0   0  25  30  36
1  16  20  12  20  25  15  25   9  15  25
试试这个:

from itertools import combinations, combinations_with_replacement

data = """\
   C1  C2  C3  C4
0   8   0   5   6
1   4   5   3   5
"""
df = pd.read_csv(io.StringIO(data), delim_whitespace=True, index_col=0)

combs = list(combinations_with_replacement(df.columns.tolist(), 2))

df_quad = pd.DataFrame()

for tup in combs:
   df_quad['{0[0]}_{0[1]}'.format(tup)] = df[tup[0]] * df[tup[1]]
测试:

解决方案
这很有趣。你教了我一个新把戏。但是,组合排除了C1_C1产品。另外,我想要一个多索引,但这很容易(我这么说)。@piRSquared,我已经注意到了这一点,并更新了我的答案;)您甚至可以
cols=pd.MultiIndex.from_tuple(combs)
然后
df_quad=pd.DataFrame(columns=cols)
然后
对于df_quad.columns中的col:df_quad[col]=df[col[0]]*df[col[1]
@piRSquared,这是个好主意!但它需要调试,它会生成一个空的DF
from itertools import combinations, combinations_with_replacement

data = """\
   C1  C2  C3  C4
0   8   0   5   6
1   4   5   3   5
"""
df = pd.read_csv(io.StringIO(data), delim_whitespace=True, index_col=0)

combs = list(combinations_with_replacement(df.columns.tolist(), 2))

df_quad = pd.DataFrame()

for tup in combs:
   df_quad['{0[0]}_{0[1]}'.format(tup)] = df[tup[0]] * df[tup[1]]
In [77]: df_quad
Out[77]:
   C1_C1  C1_C2  C1_C3  C1_C4  C2_C2  C2_C3  C2_C4  C3_C3  C3_C4  C4_C4
0     64      0     40     48      0      0      0     25     30     36
1     16     20     12     20     25     15     25      9     15     25

In [156]: df_quad.columns = pd.MultiIndex.from_tuples(combs)

In [157]: df_quad
Out[157]:
   C1              C2          C3      C4
   C1  C2  C3  C4  C2  C3  C4  C3  C4  C4
0  64   0  40  48   0   0   0  25  30  36
1  16  20  12  20  25  15  25   9  15  25

In [78]: combs
Out[78]:
[('C1', 'C1'),
 ('C1', 'C2'),
 ('C1', 'C3'),
 ('C1', 'C4'),
 ('C2', 'C2'),
 ('C2', 'C3'),
 ('C2', 'C4'),
 ('C3', 'C3'),
 ('C3', 'C4'),
 ('C4', 'C4')]
def quadratic_combinations(df):
    rng = range(len(df.columns))
    return pd.concat([df.iloc[:, i:].mul(df.iloc[:, i], axis=0) for i in rng],
                     axis=1, keys=df.columns)

df_quad = quadratic_combinations(df)

print df_quad

   C1              C2          C3      C4
   C1  C2  C3  C4  C2  C3  C4  C3  C4  C4
0  64   0  40  48   0   0   0  25  30  36
1  16  20  12  20  25  15  25   9  15  25