Как создать мультииндексный фрейм данных из двух существующих одноиндексных фреймов данных? - PullRequest
1 голос
/ 20 марта 2019

У меня есть два кадра данных, которые я хочу объединить и выполнить умножение во время слияния. Оба имеют один индекс раньше, и результирующий кадр данных должен иметь мультииндекс:

данные о местоположении

village   rainfall/year
namea     20
nameb     15
namec     30

и данные временных рядов.

hour    share of yearly rainfall
0       50.00%
1       30.00%
2       20.00%

И в результате я ищу следующий фрейм данных.

village     hour    rainfall
namea       0       10
            1       6
            2       4
nameb       0       7.5
            1       4.5
            2       3
namec       0       15
            1       9
            2       6

Так что я хочу не только объединить их, но и выполнить некоторые вычисления в процессе объединения. К сожалению, я не знаю, как этого добиться. Я думаю, что Multiindex из продукта может быть полезным, но я не понял, как это сделать. Заранее спасибо!

1 Ответ

0 голосов
/ 20 марта 2019

Вы используете merge с временным ключом для создания декартового произведения, затем вычисляете свое значение и set_index.

df_out = df_loc.assign(key=1).merge(df_ts.assign(key=1)).drop('key', axis=1)
df_out['rainfall'] = df_out['rainfall/year'] * (df_out['share of yearly rainfall'].str.strip('%').astype(float) / 100)

df_out.set_index(['village','hour'])['rainfall']

Выход:

village  hour
namea    0       10.0
         1        6.0
         2        4.0
nameb    0        7.5
         1        4.5
         2        3.0
namec    0       15.0
         1        9.0
         2        6.0
Name: rainfall, dtype: float64

Или для возврата кадра данных вместо pd.Series используйте двойные скобки:

df_out.set_index(['village','hour'])[['rainfall']]

Выход:

              rainfall
village hour          
namea   0         10.0
        1          6.0
        2          4.0
nameb   0          7.5
        1          4.5
        2          3.0
namec   0         15.0
        1          9.0
        2          6.0
...