Наиболее эффективный способ умножения каждого столбца большого pandas кадра данных на каждый второй столбец того же кадра данных - PullRequest
2 голосов
/ 10 января 2020

Предположим, у меня есть набор данных, который выглядит примерно так:

INDEX   A   B   C
    1   1   1   0.75
    2   1   1   1
    3   1   0   0.35
    4   0   0   1
    5   1   1   0

Я хочу получить кадр данных, который выглядит следующим образом, с исходными столбцами и всеми возможными взаимодействиями между столбцами:

INDEX   A   B   C       A_B     A_C     B_C
    1   1   1   0.75    1       0.75    0.75
    2   1   1   1       1       1       1
    3   1   0   0.35    0       0.35    0
    4   0   0   1       0       0       0
    5   1   1   0       1       0       0

Мои фактические наборы данных довольно большие (~ 100 столбцов). Какой самый быстрый способ достичь этого?

Я мог бы, конечно, сделать вложенный l oop или аналогичный, чтобы добиться этого, но я надеялся, что есть более эффективный способ.

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Вы можете использовать itertools.combination для этого:

>>> import pandas as pd
>>> from itertools import combinations
>>> df = pd.DataFrame({
...     "A": [1,1,1,0,1],
...     "B": [1,1,0,0,1],
...     "C": [.75,1,.35,1,0]
... })
>>> df.head()
   A  B     C
0  1  1  0.75
1  1  1  1.00
2  1  0  0.35
3  0  0  1.00
4  1  1  0.00
>>> for col1, col2 in combinations(df.columns, 2):
...     df[f"{col1}_{col2}"] = df[col1] * df[col2]
...
>>> df.head()
   A  B     C  A_B   A_C   B_C
0  1  1  0.75    1  0.75  0.75
1  1  1  1.00    1  1.00  1.00
2  1  0  0.35    0  0.35  0.00
3  0  0  1.00    0  0.00  0.00
4  1  1  0.00    1  0.00  0.00

Если вам нужно векторизовать произвольную функцию для пар столбцов, которые вы можете использовать:

import numpy as np

def fx(x, y):
    return np.multiply(x, y)

for col1, col2 in combinations(df.columns, 2):
    df[f"{col1}_{col2}"] = np.vectorize(fx)(df[col1], df[col2])
2 голосов
/ 10 января 2020

Мне неизвестна нативная pandas функция для решения этой проблемы, но itertools.combinations будет улучшением по сравнению с вложенной l oop.

Вы можете сделать что-то вроде:

from itertools import combinations

df = pd.DataFrame(data={"A": [1,1,1,0,1], 
                        "B": [1,1,0,0,1], 
                        "C": [0.75, 1, 0.35, 1, 0]})

for comb in combinations(df.columns, 2): 
    col_name = comb[0] + "_" + comb[1]
    result[col_name] = df[comb[0]] * df[comb[1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...