2 回答

TA貢獻1815條經(jīng)驗 獲得超10個贊
IIUC,combinations
并reduce
與Series.add
from itertools import combinations
from functools import reduce
cols = df.columns.copy()
for i in range(2, len(cols) + 1):
for names in combinations(cols, i):
df[''.join(names)] = reduce(lambda cum_serie, new_serie_name: \
cum_serie.add(df[new_serie_name]),
names[1:],
df[names[0]])
print(df)
輸出
A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD
0 1 1 3 2 2 4 3 4 3 5 5 4 6 6 7
編輯
df = df.rename(columns=str).astype(str)
cols = df.columns.copy()
for i in range(2, len(cols) + 1):
for names in combinations(cols, i):
df[' + '.join(names)] = reduce(lambda cum_serie, new_serie_name: \
cum_serie.str.cat(df[new_serie_name], ' + '),
names[1:],
df[names[0]])
print(df)
A B C D A + B A + C A + D B + C B + D C + D A + B + C A + B + D \
0 1 1 3 2 1 + 1 1 + 3 1 + 2 1 + 3 1 + 2 3 + 2 1 + 1 + 3 1 + 1 + 2
A + C + D B + C + D A + B + C + D
0 1 + 3 + 2 1 + 3 + 2 1 + 1 + 3 + 2

TA貢獻1853條經(jīng)驗 獲得超9個贊
我認為使用combinations是正確的方法。
首先創(chuàng)建列組合列表:
col_combs = list(combinations(df.columns, 2))
然后要獲取僅包含任何給定組合的那些列的 df,將組合元組轉換為列表,并將其傳遞給數(shù)據(jù)框。
cols = list(col_combs[0]
comb_df = `df[col_combs)]
下面是一個最小示例,說明如何為 2 列的每個組合存儲單獨的數(shù)據(jù)框:
col_combs = list(combinations(df.columns, 2))
comb_dfs = []
for cols in col_combs:
temp = df[list(cols)].copy()
comb_dfs.append(temp)
為了讓它適用于更多的列組合,您只需combinations使用您想要的值運行幾個不同的值,并在制作數(shù)據(jù)框之前將所有結果收集到一個列表中。
添加回答
舉報