我正在尝试基于3种条件在python中合并两个数据集。它们必须具有相同年份的经度,纬度和月份。一个数据集的大小约为16k,另一个为1.7k。 输入和预期输出的简单示例如下:
>df1
long lat date proximity
5 8 23/06/2009 Near
6 10 05/10/2012 Far
8 6 19/02/2010 Near
3 4 30/04/2014 Near
5 8 01/06/2009 Far
>df2
long lat date mine
5 8 10/06/2009 1
8 6 24/02/2010 0
7 2 19/04/2014 1
3 4 30/04/2013 1
如果任何条件为false,则合并时“ mine”中的值为0。我将如何合并以得到:
long lat date proximity mine
5 8 23/06/2009 Near 1
6 10 05/10/2012 Far 0
8 6 19/02/2010 Near 0
3 4 30/04/2014 Near 0
5 8 01/06/2009 Far 1
输出列中的日期列不是必需的,因为这样比较容易。
答案 0 :(得分:1)
您在这里:
df1['year-month'] = pd.to_datetime(df1['date'], format='%d/%m/%Y').dt.strftime('%Y/%m')
df2['year-month'] = pd.to_datetime(df2['date'], format='%d/%m/%Y').dt.strftime('%Y/%m')
joined = df1.merge(df2,
how='left',
on =['long', 'lat', 'year-month'],
suffixes=['', '_r']).drop(columns = ['date_r', 'year-month'])
joined['mine'] = joined['mine'].fillna(0).astype(int)
print(joined)
输出
long lat date proximity mine
0 5 8 23/06/2009 Near 1
1 6 10 05/10/2012 Far 0
2 8 6 19/02/2010 Near 0
3 3 4 30/04/2014 Near 0
4 5 8 01/06/2009 Far 1
答案 1 :(得分:0)
首先从month
列中提取year
和date
并将其分配给临时列mon-year
,然后使用DataFrame.merge
左合并数据帧{ {1}},{{1}上的df1
,然后使用Series.fillna
用df2
填充long, lat and mon-year
列中的NaN
值,最后使用DataFrame.drop
删除临时列mine
:
0
结果:
mon-year
答案 2 :(得分:0)
您可以使用多个键进行合并,如下所示:
df_1.merge(df_2, how='left', left_on=['long', 'lat', 'date'], right_on=['long', 'lat', 'date'])