在Python中,将数据框中的每一列与其右边的列相乘

时间:2019-01-15 10:43:32

标签: python pandas numpy

我有一个大型数据框,其中包含约400.000个观测值和6.500列。我正在寻找一种快速的方式,将每一列与其右边的列依次相乘。

示例数据框可能如下所示:

| V1  | V2  | V3  |  
----------------------
|  1  |  2  |  1  |
|  0  |  4  |  1  |
|  1  |  3  |  3  |

我最后想要这样的东西:

| V1 | V2 | V3 | V1_V2 | V1_V3 | V2_V3 |
-----------------------------------------
|  1 |  2 |  1 |    2  |   1   |   2   |
|  0 |  4 |  1 |    0  |   0   |   4   |
|  1 |  3 |  3 |    3  |   0   |   9   |

我尝试了itertools.combinations,但是速度太慢。我是Python的初学者,所以也许有一个我不知道的简单解决方案。

谢谢您的帮助!

4 个答案:

答案 0 :(得分:1)

熊猫矢量化运算(例如乘法)本身就是有效的。您可以使用以下内容来利用此功能:

# Extract column names
cols =  df.columns.tolist() 

# Generate all adjacent pairs, including the circular one
cols_to_create = [(cols[i], cols[i+1]) for i in range(len(cols)-1)] \
                 + [(cols[len(cols)-1], cols[0])] 

# Perform multiplication on all pairs
for x, y in cols_to_create:
    df[x+'_'+y] = df[x]*df[y]

答案 1 :(得分:0)

类似的东西可以与itertools一起使用:

import pandas as pd
import numpy as np
from  itertools import combinations
from io import StringIO

data = """
v1 v2 v3
1 2 1
0 4 1
1 3 3
"""

df = pd.read_csv(StringIO(data), sep='\s+')

l = list(combinations(df.columns,2))
df_add = pd.concat([df[col[1]] * (df[col[0]]) for col in l], axis=1, keys=l)
df_add.columns = df_add.columns.map(''.join)

df_add

   v1v2  v1v3  v2v3
0     2     1     2
1     0     0     4
2     3     3     9

df.join(df_add)

   v1  v2  v3  v1v2  v1v3  v2v3
0   1   2   1     2     1     2
1   0   4   1     0     0     4
2   1   3   3     3     3     9

答案 2 :(得分:0)

在熊猫文档中浏览Enhancing Performance,您可以尝试df.eval() expression

例如,df.eval('0_V2 = V0 * V2', inplace=True)

#!/usr/bin/python3
import pandas as pd
import numpy as np

rows = 10000
cols = 300
df = pd.DataFrame()
for c in range(cols):
    df['V{}'.format(c)] = np.random.randn(rows)

n = len(df.columns)
for i in range(n):
    for j in range(i+1, n):
        a = df.columns[i]
        b = df.columns[j]
        expr = '{0}_{1} = {0} * {1}'.format(a, b)
        df.eval(expr, inplace=True)
print(df)

答案 3 :(得分:0)

嵌套循环是可能的,但并非绝对必要。您可以使用pd.DataFrame.multiply将数据帧乘以索引系列,从而使用单个循环:

<button id="button1" type="button" onclick="message(1)" name="button">Button 1</button>
<button id="button2" type="button" onclick="message(2)" name="button">Button 2</button>
<button id="button3" type="button" onclick="message(3)" name="button">Button 3</button>