Спасибо за любую помощь. Я пытаюсь умножить несколько столбцов на несколько других столбцов, чтобы создать в этом примере 6 новых столбцов (A C, A D, A E, B C, B < em> D, B E). Как вы можете видеть, есть указатель даты и столбца идентификатора. Эта таблица является лишь примером гораздо большего Dataframe.

            id      A           B           C           D           E         
2017-12     93426   0.687377    -4.000753   -3.191796   0.235393    0.0071  
2017-12     93428   0.240590    -4.000753   -3.191796   0.235393    0.0071  
2017-12     93429   0.052937    -4.000753   -3.191796   0.235393    0.0071  
2017-12     93434   0.910938    -4.000753   -3.191796   0.235393    0.0071  
2017-12     93436   0.137670    -4.000753   -3.191796   0.235393    0.0071  
2018-01     93426   3.362003    -2.997135   -2.029331   1.016955    0.011298
2018-01     93428   1.330341    -2.997135   -2.029331   1.016955    0.011298
2018-01     93429   1.579284    -2.997135   -2.029331   1.016955    0.011298    

Моя попытка:

df[['A','B']].mul(df[['C','D','E']])

>>> TypeError: Cannot compare type 'Period' with type 'str'

Любая помощь всегда ценится!

1
TChi 27 Фев 2020 в 01:29

3 ответа

Лучший ответ

Используя itertools.product:

from itertools import product

l1 = ['A', 'B']
l2 = ['C', 'D', 'E']

for c1, c2 in product(l1, l2):
    df[f'{c1}{c2}'] = df[c1].mul(df[c2])


            id         A         B         C         D         E        AC  \
2017-12  93426  0.687377 -4.000753 -3.191796  0.235393  0.007100 -2.193967   
2017-12  93428  0.240590 -4.000753 -3.191796  0.235393  0.007100 -0.767914   
2017-12  93429  0.052937 -4.000753 -3.191796  0.235393  0.007100 -0.168964   
2017-12  93434  0.910938 -4.000753 -3.191796  0.235393  0.007100 -2.907528   
2017-12  93436  0.137670 -4.000753 -3.191796  0.235393  0.007100 -0.439415   
2018-01  93426  3.362003 -2.997135 -2.029331  1.016955  0.011298 -6.822617   
2018-01  93428  1.330341 -2.997135 -2.029331  1.016955  0.011298 -2.699702   
2018-01  93429  1.579284 -2.997135 -2.029331  1.016955  0.011298 -3.204890   

               AD        AE         BC        BD        BE  
2017-12  0.161804  0.004880  12.769587 -0.941749 -0.028405  
2017-12  0.056633  0.001708  12.769587 -0.941749 -0.028405  
2017-12  0.012461  0.000376  12.769587 -0.941749 -0.028405  
2017-12  0.214428  0.006468  12.769587 -0.941749 -0.028405  
2017-12  0.032407  0.000977  12.769587 -0.941749 -0.028405  
2018-01  3.419006  0.037984   6.082179 -3.047951 -0.033862  
2018-01  1.352897  0.015030   6.082179 -3.047951 -0.033862  
2018-01  1.606061  0.017843   6.082179 -3.047951 -0.033862  

< Сильный > Подробнее :

itertools.product дает нам комбинации двух списков, поэтому мы перебираем эти комбинации и создаем наши столбцы:

list(product(l1, l2))

[('A', 'C'), ('A', 'D'), ('A', 'E'), ('B', 'C'), ('B', 'D'), ('B', 'E')]

Полезное редактирование из OC

Я использую Python 3.4 и должен был использовать функцию .format

df['{c1}{c2}'.format(c1=c1, c2=c2)]
2
TChi 27 Фев 2020 в 15:06

Пытаться:

from itertools import product
pd.concat([(df[i]*df[j]).rename(i+j) for i, j in product(['A', 'B'],['C', 'D', 'E'])], axis=1)

Выход:

               AC        AD        AE         BC        BD        BE
2017-12 -2.193967  0.161804  0.004880  12.769587 -0.941749 -0.028405
2017-12 -0.767914  0.056633  0.001708  12.769587 -0.941749 -0.028405
2017-12 -0.168964  0.012461  0.000376  12.769587 -0.941749 -0.028405
2017-12 -2.907528  0.214428  0.006468  12.769587 -0.941749 -0.028405
2017-12 -0.439415  0.032407  0.000977  12.769587 -0.941749 -0.028405
2018-01 -6.822617  3.419006  0.037984   6.082179 -3.047951 -0.033862
2018-01 -2.699702  1.352897  0.015030   6.082179 -3.047951 -0.033862
2018-01 -3.204890  1.606061  0.017843   6.082179 -3.047951 -0.033862

И вы можете стать немного странным и использовать assign для объединения результатов обратно в исходный фрейм данных:

df.assign(**pd.concat([(df[i]*df[j]).rename(i+j) for i, j in product(['A', 'B'],['C', 'D', 'E'])], axis=1))

Выход:

            id         A         B         C         D         E        AC        AD        AE         BC        BD        BE
2017-12  93426  0.687377 -4.000753 -3.191796  0.235393  0.007100 -2.193967  0.161804  0.004880  12.769587 -0.941749 -0.028405
2017-12  93428  0.240590 -4.000753 -3.191796  0.235393  0.007100 -0.767914  0.056633  0.001708  12.769587 -0.941749 -0.028405
2017-12  93429  0.052937 -4.000753 -3.191796  0.235393  0.007100 -0.168964  0.012461  0.000376  12.769587 -0.941749 -0.028405
2017-12  93434  0.910938 -4.000753 -3.191796  0.235393  0.007100 -2.907528  0.214428  0.006468  12.769587 -0.941749 -0.028405
2017-12  93436  0.137670 -4.000753 -3.191796  0.235393  0.007100 -0.439415  0.032407  0.000977  12.769587 -0.941749 -0.028405
2018-01  93426  3.362003 -2.997135 -2.029331  1.016955  0.011298 -6.822617  3.419006  0.037984   6.082179 -3.047951 -0.033862
2018-01  93428  1.330341 -2.997135 -2.029331  1.016955  0.011298 -2.699702  1.352897  0.015030   6.082179 -3.047951 -0.033862
2018-01  93429  1.579284 -2.997135 -2.029331  1.016955  0.011298 -3.204890  1.606061  0.017843   6.082179 -3.047951 -0.033862

Или просто join

df.join(pd.concat([(df[i]*df[j]).rename(i+j) for i, j in product(['A', 'B'],['C', 'D', 'E'])], axis=1))
0
Scott Boston 26 Фев 2020 в 22:44

Вещание не плохой вариант:

pd.DataFrame(
    (df[['A','B']].values[:,:,None]
        * df[['C','D','E']].values[:,None,:]
    ).reshape(len(df),-1),
    columns = [f'{x}{y}' for x in 'AB' for y in 'CDE'],
    index = df.index
)

Выход:

               AC        AD        AE         BC        BD        BE
2017-12 -2.193967  0.161804  0.004880  12.769587 -0.941749 -0.028405
2017-12 -0.767914  0.056633  0.001708  12.769587 -0.941749 -0.028405
2017-12 -0.168964  0.012461  0.000376  12.769587 -0.941749 -0.028405
2017-12 -2.907528  0.214428  0.006468  12.769587 -0.941749 -0.028405
2017-12 -0.439415  0.032407  0.000977  12.769587 -0.941749 -0.028405
2018-01 -6.822617  3.419006  0.037984   6.082179 -3.047951 -0.033862
2018-01 -2.699702  1.352897  0.015030   6.082179 -3.047951 -0.033862
2018-01 -3.204890  1.606061  0.017843   6.082179 -3.047951 -0.033862
1
Quang Hoang 26 Фев 2020 в 23:10