Сопоставьте два фрейма данных с разным количеством строк в зависимости от года, месяца и дня их столбцов

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, подобный следующему (df1):

 index,col1,col2
2020-01-01,A,Y
2020-01-02,B,Z
 

И еще один, подобный следующему (df2):

 index,date, .....
1,2020-01-01 13:44
2,2020-01-01 15:22
3,2020-01-01 23:11
4,2020-01-01 13:44
5,2020-01-02 13:28
6,2020-01-02 17:55
 

Мне нужно сопоставить df2 [‘date’] год, месяц и день с df1.index year, month и day, чтобы получить окончательный фрейм данных следующим образом:

 index,col1,col2
2020-01-01 13:44,A,Y
2020-01-01 15:22,A,Y
2020-01-01 23:11,A,Y
2020-01-01 13:44,A,Y
2020-01-02 13:28,B,Z
2020-01-02 17:55,B,Z
 

Что-то вроде следующего выполнит эту работу:

 pd.Dataframe(mapped_values, index=df2['date'], columns=df1.columns)
 

Как я могу получить здесь mapped_values?

Ответ №1:

Вы можете попробовать объединить:

 df2['day'] = df2['date'].dt.normalize()
df2.merge(df1, left_on='day', right_index=True)
 

Вывод:

                      date        day col1 col2
index                                         
1     2020-01-01 13:44:00 2020-01-01    A    Y
2     2020-01-01 15:22:00 2020-01-01    A    Y
3     2020-01-01 23:11:00 2020-01-01    A    Y
4     2020-01-01 13:44:00 2020-01-01    A    Y
5     2020-01-02 13:28:00 2020-01-02    B    Z
6     2020-01-02 17:55:00 2020-01-02    B    Z
 

Ответ №2:

Это делается следующим образом.

Модули

 import pandas as pd
import io
 

Данные

 df1 = pd.read_csv(io.StringIO("""
index,col1,col2
2020-01-01,A,Y
2020-01-02,B,Z
"""), sep=",", engine="python")

df2 = pd.read_csv(io.StringIO("""
index,date
1,2020-01-01 13:44
2,2020-01-01 15:22
3,2020-01-01 23:11
4,2020-01-01 13:44
5,2020-01-02 13:28
6,2020-01-02 17:55
"""), sep=",", engine="python")
 

Форматирование даты

 df1['ndate'] = pd.to_datetime(df1['index'])
df2['ndate'] = pd.to_datetime(df2['date'])
df2['ndate'] = pd.to_datetime(df2['ndate'].dt.strftime('%Y-%m-%d'))
 

Слияние

 pd.merge(df2, df1, on=['ndate'])