Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按日期和列名匹配2个数据帧以获取值_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 按日期和列名匹配2个数据帧以获取值

Python 按日期和列名匹配2个数据帧以获取值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有两个数据帧(它们已经是数据帧格式,但为了便于说明,我首先将它们创建为字典): 及 现在,如果df1.Date按年份和月份与df2.Date匹配,我想在df1中添加一个额外的列,其中包含df2的值(日期通常不匹配,因为df1包含月末日期)如果df2的列名与相应的df1.name值匹配 所以结果应该是这样的: df_new = { 'Date':['2013-02-14','2013-03-03','2013-05-02','2014-10-31'], 'Name

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

现在,如果
df1.Date
按年份和月份与
df2.Date
匹配,我想在
df1
中添加一个额外的列,其中包含
df2
值(日期通常不匹配,因为
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)
你对如何解决这个问题有什么建议吗


我考虑为
year
month
df1['year']=df1['Date'].dt.year
)创建额外的列,然后匹配
df1[[df1['year']==df2['year']]和(df1['month']==df2[/code>,并调用
df2.column
,但总的来说,我不知道如何将所有内容放在一起,尽量不要把你的数据集以图片的形式发布,b/c这很难帮到你

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

df1['Date_round'] = df1['Date'] - pd.offsets.MonthBegin(1)
df2['Date_round'] = df2['Date'] - pd.offsets.MonthBegin(1)
然后使用
melt
重塑
df2

df2_reshaped = df2.melt(id_vars=['Date','Date_round'], var_name='Name', value_name='Values')
然后,您可以使用
pd.merge
Date\u round
Name
上加入数据帧

df = pd.merge(df1, df2_reshaped.drop('Date', axis=1), how='left', on=['Date_round', 'Name'])
df2_reshaped = df2.melt(id_vars=['Date','Date_round'], var_name='Name', value_name='Values')
df = pd.merge(df1, df2_reshaped.drop('Date', axis=1), how='left', on=['Date_round', 'Name'])