我有一个大型数据框,其中包含约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的初学者,所以也许有一个我不知道的简单解决方案。
谢谢您的帮助!
答案 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>