熊猫在循环中将多列相乘

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

【讨论】:

以上是关于熊猫在循环中将多列相乘的主要内容,如果未能解决你的问题,请参考以下文章

Python将包含科学值和浮点值的熊猫数据框与浮点数相乘

如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?

在 django 中将两个字段相乘

如何在 Access 2010 中将单个字段的所有记录相乘

如何在 django 中将模型与不同的应用程序相乘?

如何在openGL中将矩阵相乘