Умножьте каждый столбец во фрейме данных на столбцы справа в Python - PullRequest
0 голосов
/ 15 января 2019

У меня большой фрейм данных с 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, поэтому, возможно, есть простое решение, о котором я не знаю.

Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Просматривая Повышение производительности на документах pandas, вы можете попробовать выражение df.eval ()

Например, 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)
0 голосов
/ 15 января 2019

Вложенный цикл возможен, но не является строго обязательным. Вы можете использовать pd.DataFrame.multiply, чтобы умножить фрейм данных на серию на индекс и, таким образом, использовать один цикл:

import pandas as pd

df = pd.DataFrame({'V1': [1, 0, 1],
                   'V2': [2, 4, 3],
                   'V3': [1, 1, 3]})

combs = pd.concat([df.iloc[:, idx+1:].multiply(df.iloc[:, idx], axis='index')\
                     .add_prefix(f'{df.columns[idx]}_') \
                   for idx in range(df.shape[1])], axis=1)

df = df.join(combs)

print(df)

   V1  V2  V3  V1_V2  V1_V3  V2_V3
0   1   2   1      2      1      2
1   0   4   1      0      0      4
2   1   3   3      3      3      9
0 голосов
/ 15 января 2019

примерно так будет работать с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...