Объедините фрейм данных hour_index с фреймом данных day_index и заполните все строки одним и тем же значением из фрейма данных day_index - PullRequest
1 голос
/ 25 мая 2019

В настоящее время у меня есть два кадра данных, один проиндексирован на hour, другой - на day.

df1
                      col1    col2   col3
datetime
2018-03-01 10:00       1        2      3
2018-03-01 11:00       1        2      3 
2018-03-01 12:00       1        2      3


df2
                col4      col5
datetime
2018-03-01       10        20 
2018-03-02       10        20 
2018-03-03       10        20

Я хочу объединить два фрейма данных, чтобы я мог добавить значения из col4 и col5 в df1, но таким образом, чтобы все строки в df1 были заполнены соответствующим значением из df2, а не просто одной строкой для ежедневно.

Если я делаю ниже:

df_merge=pd.merge(df1,df2, how='outer', left_index=True, right_index=True)

Я получаю:

    df1
                      col1    col2   col3   col4   col5
datetime
2018-03-01 10:00       1        2      3     10      20
2018-03-01 11:00       1        2      3     NaN     NaN
2018-03-01 12:00       1        2      3     NaN     NaN...

Есть ли способ, чтобы я также заполнил NaN 10 и 20? Поэтому все часы на 2018-03-01 должны быть заполнены одинаковыми значениями для col4 и col5 ...

Спасибо

1 Ответ

1 голос
/ 25 мая 2019

Вы можете использовать Series.dt.floor и объединить его с left_on:

a = df1.index.floor('d')
df_merge=pd.merge(df1,df2, how='outer', left_on=a, right_index=True)
print (df_merge)
                         key_0  col1  col2  col3  col4  col5
datetime                                                    
2018-03-01 10:00:00 2018-03-01   1.0   2.0   3.0    10    20
2018-03-01 11:00:00 2018-03-01   1.0   2.0   3.0    10    20
2018-03-01 12:00:00 2018-03-01   1.0   2.0   3.0    10    20
2018-03-01 12:00:00 2018-03-02   NaN   NaN   NaN    10    20
2018-03-01 12:00:00 2018-03-03   NaN   NaN   NaN    10    20

При необходимости удалить столбец, заполненный датами:

a = df1.index.floor('d')
df_merge=pd.merge(df1,df2, how='outer', left_on=a, right_index=True).drop('key_0', 1)
print (df_merge)
                     col1  col2  col3  col4  col5
datetime                                         
2018-03-01 10:00:00   1.0   2.0   3.0    10    20
2018-03-01 11:00:00   1.0   2.0   3.0    10    20
2018-03-01 12:00:00   1.0   2.0   3.0    10    20
2018-03-01 12:00:00   NaN   NaN   NaN    10    20
2018-03-01 12:00:00   NaN   NaN   NaN    10    20

Также кажется, что здесь необходимо левое соединение:

a = df1.index.floor('d')
df_merge=pd.merge(df1,df2, how='left', left_on=a, right_index=True)
print (df_merge)

                     col1  col2  col3  col4  col5
datetime                                         
2018-03-01 10:00:00     1     2     3    10    20
2018-03-01 11:00:00     1     2     3    10    20
2018-03-01 12:00:00     1     2     3    10    20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...