#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'])