我有两个数据框(它们已经是数据框格式,但为了便于说明,我首先将它们创建为字典):
first = {
'Date':['2013-02-14','2013-03-03','2013-05-02','2014-10-31'],
'Name':['Felix','Felix','Peter','Paul']}
df1 = pd.DataFrame(first)
还有
second = {
'Date':['2013-02-28','2013-03-31','2013-05-30','2014-10-31'],
'Felix':['Value1_x','Value2_x','Value3_x','Value4_x'],
'Peter':['Value1_y','Value2_y','Value3_y','Value4_y']}
df2 = pd.DataFrame(second)
现在,我想向 df1
添加一个附加列,其中包含 df2
的 值
,如果 df1.Date
按年和月匹配 df2.Date
(该日期通常不匹配,因为 df1
包含月末日期)并且如果 的列名称>df2
与相应的 df1.Name
值匹配。
所以结果应该是这样的:
df_new = {
'Date':['2013-02-14','2013-03-03','2013-05-02','2014-10-31'],
'Name':['Felix','Felix','Peter','Paul'],
'Values':['Value1_x','Value2_x','Value3_y','NaN']}
df_new = pd.DataFrame(df_new)
您对如何解决这个问题有什么建议吗?
我考虑过为年
和月
创建额外的列(df1['year']= df1['Date'].dt.year
) 然后匹配 df1[(df1['year'] == df2['year']) & (df1['month'] == df2['month'])]
并调用df2.column
但我不知道如何将所有内容放在一起
最佳答案
一般来说,尽量不要将您的数据集作为图像发布,因为那样就很难帮助您了。
我认为最简单的方法是在每个数据框中创建一个列,其中日期
四舍五入到每月的第一天。
df1['Date_round'] = df1['Date'] - pd.offsets.MonthBegin(1)
df2['Date_round'] = df2['Date'] - pd.offsets.MonthBegin(1)
然后使用melt
reshape df2
。
df2_reshaped = df2.melt(id_vars=['Date','Date_round'], var_name='Name', value_name='Values')
然后您可以使用 pd.merge
连接 Date_round
和 Name
上的数据框。
df = pd.merge(df1, df2_reshaped.drop('Date', axis=1), how='left', on=['Date_round', 'Name'])
关于python - 按日期和列名称匹配 2 个数据框以获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57474453/