熊猫在循环中将多列相乘
Posted
技术标签:
【中文标题】熊猫在循环中将多列相乘【英文标题】:Pandas Multiply multiple columns in loop 【发布时间】:2019-10-07 15:27:36 【问题描述】:我有一个数据框 df,有 4 个列,A、B、C 和 D
我想对这些列的每个组合进行多个组合。
到目前为止我有;
columns=[A,B,C,D]
a= combinations(columns)
for i in a:
df[outname]=df[a].multiply()
但显然这是不正确的。
谁能看到好方法?
输出:
A B C D AB AC AD BC ABC and so on
0
1
2
3
4
6
7
【问题讨论】:
所需的输出是所有可能的列相乘 【参考方案1】:使用this 中的函数查找所有组合并在列表理解中创建所有值的乘积:
df = pd.DataFrame(
'A':[5,3,6,9,2,4],
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
)
from itertools import chain, combinations
def all_subsets(ss):
return chain(*map(lambda x: combinations(ss, x), range(1, len(ss)+1)))
#get all combination
tups = list(all_subsets(df.columns))
#for each combination multiple values
df1 = pd.concat([df.loc[:,c].product(axis=1) for c in tups], axis=1)
#set new columns by join list of tuples tups
df1.columns = [''.join(x) for x in tups]
print (df1)
A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD
0 5 4 7 1 20 35 5 28 4 7 140 20 35 28 140
1 3 5 8 3 15 24 9 40 15 24 120 45 72 120 360
2 6 4 9 5 24 54 30 36 20 45 216 120 270 180 1080
3 9 5 4 7 45 36 63 20 35 28 180 315 252 140 1260
4 2 5 2 1 10 4 2 10 5 2 20 10 4 10 20
5 4 4 3 0 16 12 0 12 0 0 48 0 0 0 0
【讨论】:
这很棒。非常感谢【参考方案2】:用途:
import itertools
L=[(x, y) for x, y in itertools.product(df.columns,df.columns) if x != y]
pd.concat([pd.DataFrame(''.join(i):df.loc[:,i].prod(axis=1)) for i in L],axis=1)
AB AC AD BA BC BD CA CB CD DA DB DC
0 20 35 5 20 28 4 35 28 7 5 4 7
1 15 24 9 15 40 15 24 40 24 9 15 24
2 24 54 30 24 36 20 54 36 45 30 20 45
3 45 36 63 45 20 35 36 20 28 63 35 28
4 10 4 2 10 10 5 4 10 2 2 5 2
5 16 12 0 16 12 0 12 12 0 0 0 0
【讨论】:
所有组合都有,不止2个 缺少 3、1、4 的组合,如需要 OP。【参考方案3】:您可以生成具有变体大小的组合列表。
import itertools
l=[] # final list
ll = list('ABCD') # list of letters
for L in range(0, len(ll)+1):
for subset in itertools.combinations(ll, L):
l.append(''.join(subset))
del(l[0]) # remove the empty string ''
print(l)
['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD', 'ABCD']
你像这样使用数据框:
df = pd.DataFrame(
'A':[5,3,6,9,2,4],
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
)
那么你就可以使用这段代码了:
l=['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD', 'ABCD']
for i in l:
if(len(i)>1):
df[i]=1 # set the initial value to 1
for i in l:
if(len(i)>1):
plets=list(i)
for p in plets:
df[i]*=df[p] #makes the product based on columns name disolver
print(df)
A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD
0 5 4 7 1 20 35 5 28 4 7 140 20 35 28 140
1 3 5 8 3 15 24 9 40 15 24 120 45 72 120 360
2 6 4 9 5 24 54 30 36 20 45 216 120 270 180 1080
3 9 5 4 7 45 36 63 20 35 28 180 315 252 140 1260
4 2 5 2 1 10 4 2 10 5 2 20 10 4 10 20
5 4 4 3 0 16 12 0 12 0 0 48 0 0 0 0
【讨论】:
【参考方案4】:使用组合和链来获得多重列,然后使用DataFrame.eval
:
comb_list = list(chain.from_iterable([list(combinations(df.columns, i)) for i in range(2, len(df.columns)+1)]))
#method 1
for comb in comb_list:
df[''.join(comb)] = df.eval('*'.join(comb))
#method 2
df = pd.concat([df]+[pd.DataFrame(df.eval('*'.join(comb)),
columns=[''.join(comb)]) for comb in comb_list], 1)
print(df)
A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD
0 5 4 7 1 20 35 5 28 4 7 140 20 35 28 140
1 3 5 8 3 15 24 9 40 15 24 120 45 72 120 360
2 6 4 9 5 24 54 30 36 20 45 216 120 270 180 1080
3 9 5 4 7 45 36 63 20 35 28 180 315 252 140 1260
4 2 5 2 1 10 4 2 10 5 2 20 10 4 10 20
5 4 4 3 0 16 12 0 12 0 0 48 0 0 0 0
【讨论】:
以上是关于熊猫在循环中将多列相乘的主要内容,如果未能解决你的问题,请参考以下文章