Функция продукта itertools () с суммой - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть один фрейм данных A с несколькими столбцами, и я хотел бы объединить все эти столбцы «с собой», чтобы получить фрейм данных B.

A = [col1 col2 col3 
       0    1    2
       1    1    0
      -1    0    1]

, и B должен выглядеть следующим образом:

B = [col1+col2  col1+col3  col2+col3
         1          2           3
         2          1           1
        -1          0           1]

По сути, в основе этой операции лежит именно то, что встроено в функцию itertools.product (), которая дает декартово произведение.

itertools.product ('ABCD', 'xy')-> Axe Ay Bx By Cx Cy Dx Dy

Мне просто нужно применить тот же принцип и получить:
function_smg ('ABCD', 'xy') -> A + x A + yB + x B + y C + x C + y D + x D + y

Мой кадр данных огромен, поэтому я не могу позволить себе циклы, и мне нужен итератор или генератор.Если нет функции, которая бы помогала, как я могу построить генератор для этого?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вот один из подходов.Вы можете начать с получения всех комбинаций длины 2 из существующих столбцов, используя itertools.combinations:

from itertools import combinations
c = combinations(df.T.values.tolist(), 2)
# [([0, 1, -1], [1, 1, 0]), ([0, 1, -1], [2, 0, 1]), ([1, 1, 0], [2, 0, 1])]

, а затем добавьте значения в каждом кортеже, сжатые вместе с:

from itertools import starmap
from operator import add

l = [list(starmap(add,zip(i,j))) for i,j in c]
pd.DataFrame(l, index=df.columns).T

    col1  col2  col3
0     1     2     3
1     2     1     1
2    -1     0     1

Или, если numpy также вариант:

import numpy as np
c = list(combinations(df.T.values.tolist(), 2))
pd.DataFrame(np.array(c).sum(1), index=df.columns).T

    col1  col2  col3
0     1     2     3
1     2     1     1
2    -1     0     1
0 голосов
/ 28 февраля 2019

На самом деле есть что-то более точное, чем продукт itertools для этой проблемы.Попробуйте комбинации itertools

import pandas as pd
from itertools import combinations
A = pd.DataFrame({"col1": [0, 1, -1],
              "col2": [1, 1, 0],
              "col3": [2, 0, 1]})

B = pd.DataFrame() #Create an empty dataframe first
for col1, col2 in combinations(A.columns, 2):
    B[f"{col1}+{col2}"] = A[col1] + A[col2] #Create columns one by one.
    #B["{}+{}".format(col1, col2)] = A[col1] + A[col2] (Before python 3.6)

print(B)
#Output:
   col1+col2  col1+col3  col2+col3
0          1          2          3
1          2          1          1
2         -1          0          1
...