Умножьте 2 разных кадра данных с одинаковым размером и повторяющимися строками - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь умножить два фрейма данных

Df1

Name|Key |100|101|102|103|104
Abb   AB   2   6  10   5   1
Bcc   BC   1   3   7   4   2
Abb   AB   5   1  11   3   1
Bcc   BC   7   1   4   5   0

Df2

Key_1|100|101|102|103|104
AB     10  2   1   5   1
BC     1  10   2   2   4

Ожидаемый вывод

Name|Key |100|101|102|103|104
Abb   AB  20  12   10  25   1
Bcc   BC   1  30   14   8   8
Abb   AB  50   2   11  15  1
Bcc   BC   7  10   8   10   0

У меня есть попытался сгруппировать Df1, а затем умножить на Df2, но это не сработало. Пожалуйста, помогите мне, как решить эту проблему

Ответы [ 3 ]

4 голосов
/ 19 марта 2020

Вы можете rename от df2 Key_1 до Key (аналогично df1), затем установить индекс и mul на level=1

df1.set_index(['Name','Key']).mul(df2.rename(columns={'Key_1':'Key'})
                              .set_index('Key'),level=1).reset_index()

или аналогично:

df1.set_index(['Name','Key']).mul(df2.set_index('Key_1')
   .rename_axis('Key'),level=1).reset_index()

Как правильно указал @QuangHoang, вы можете обойтись и без переименования:

df1.set_index(['Name','Key']).mul(df2.set_index('Key_1'),level=1).reset_index()

  Name Key  100  101  102  103  104
0  Abb  AB   20   12   10   25    1
1  Bcc  BC    1   30   14    8    8
2  Abb  AB   50    2   11   15    1
3  Bcc  BC    7   10    8   10    0
3 голосов
/ 19 марта 2020

Мы также можем использовать DataFrame.merge с pd.Index.difference для выбора столбцов.

mul_cols = df1.columns.difference(['Name','Key'])                                                                                
df1.assign(**df1[mul_cols].mul(df2.merge(df1[['Key']],
                                             left_on = 'Key_1',
                                             right_on = 'Key')[mul_cols]))

  Name Key  100  101  102  103  104
0  Abb  AB   20   12   10   25    1
1  Bcc  BC   10    6    7   20    2
2  Abb  AB    5   10   22    6    4
3  Bcc  BC    7   10    8   10    0
3 голосов
/ 19 марта 2020

IIU C reindex_like

df1.set_index('Key',inplace=True)
df1=df1.mul(df2.set_index('Key_1').reindex_like(df1).values).fillna(df1)
Out[235]: 
    Name   100   101   102   103  104
Key                                  
AB   Abb  20.0  12.0  10.0  25.0  1.0
BC   Bcc   1.0  30.0  14.0   8.0  8.0
AB   Abb  50.0   2.0  11.0  15.0  1.0
BC   Bcc   7.0  10.0   8.0  10.0  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...