通过日期和列名匹配2个数据框以获取值

时间:2019-08-13 09:06:11

标签: python python-3.x pandas dataframe

我有两个数据框(它们已经是数据框格式,但是为了说明起见,我首先将它们创建为字典):

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按年份与values相匹配,我想在df2的{​​{1}}中向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) yearmonth)创建其他列,然后匹配df1['year']= df1['Date'].dt.year并调用df1[(df1['year'] == df2['year']) & (df1['month'] == df2['month'])],但是我不知道如何把所有东西放在一起

1 个答案:

答案 0 :(得分:1)

通常,尽量不要将您的数据集发布为图像,否则,很难帮助您。

我认为最简单的方法是在每个数据框中创建一列,其中Date会四舍五入到每个月的第一天。

df1['Date_round'] = df1['Date'] - pd.offsets.MonthBegin(1)
df2['Date_round'] = df2['Date'] - pd.offsets.MonthBegin(1)

然后使用df2重塑melt

df2_reshaped = df2.melt(id_vars=['Date','Date_round'], var_name='Name', value_name='Values')

然后您可以使用Date_roundNamepd.merge上的数据帧合并起来。

df = pd.merge(df1, df2_reshaped.drop('Date', axis=1), how='left', on=['Date_round', 'Name'])