如何根据条件合并两个数据集

时间:2020-06-23 13:40:42

标签: python pandas dataframe dataset

我正在尝试基于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

输出列中的日期列不是必需的,因为这样比较容易。

3 个答案:

答案 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列中提取yeardate并将其分配给临时列mon-year,然后使用DataFrame.merge左合并数据帧{ {1}},{{1}上的df1,然后使用Series.fillnadf2填充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'])