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