Умножение pandas фреймов данных различного размера - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть 2 pandas DataFrames.

Первый содержит данные о годовых отчетах фирмы для c компаний в США. Другими словами, каждое наблюдение (строка) содержит данные об одной фирме за один год.

Второй блок данных имеет данные о среднегодовых уровнях инфляции.

Я должен умножить все значения от первого df с уровнем инфляции за соответствующий год во втором df. Как я могу go об этом?

Example DataFrames

df1:

index    year    firm    assets    ppe    other_variable
  0      2000     1        50       2           5
  1      2001     1        60       3           5
  2      2000     2        30       5          10
  3      2001     2        45       5           8
  4      2002     2        50      10           8
...

df2:

year    cpi
2000    1.000
2001    1.010
2002    1.022
...

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете умножить все столбцы без предварительного выбора на DataFrame.iloc на сопоставленные значения на year, если совпадения не созданы, пропущенные значения заменяются на 1 в fillna при необходимости и на несколько DataFrame.mul:

y = df1['year'].map(df2.set_index('year')['cpi']).fillna(1)
df1.iloc[:, 1:] = df1.iloc[:, 1:].mul(y, axis=0)
print (df1)
   year   firm  assets    ppe  other_variable
0  2000  1.000   50.00   2.00           5.000
1  2001  1.010   60.60   3.03           5.050
2  2000  2.000   30.00   5.00          10.000
3  2001  2.020   45.45   5.05           8.080
4  2002  2.044   51.10  10.22           8.176

Другая идея заключается в добавлении столбца cpi к первому DataFrame с помощью DataFrame.join, а затем повторении с DataFrame.pop для столбца извлечения:

df = df1.set_index('year').join(df2.set_index('year'))
df = df.mul(df.pop('cpi'), axis=0).reset_index()
print (df)
   year   firm  assets    ppe  other_variable
0  2000  1.000   50.00   2.00           5.000
1  2000  2.000   30.00   5.00          10.000
2  2001  1.010   60.60   3.03           5.050
3  2001  2.020   45.45   5.05           8.080
4  2002  2.044   51.10  10.22           8.176
...