Как объединить DataFrame с несколькими условиями в разных столбцах? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть два фрейма данных следующим образом: mydata1:

   ID   X1   X2  Date1
   002  324  634  2016-01-01
   002  334  534  2016-01-14 
   002  354  834  2016-01-30
   004  543  843  2017-02-01
   004  923  043  2017-04-15
   005  032  212  2015-09-01 
   005  523  843  2017-09-15
   005  212  222  2015-10-1

mydata2:

   ID   Y1     Y2    Date2
   002  1224   234  2016-01-04
   002  1254   249  2016-01-28
   004  321    212  2016-12-01 
   005  1121   222  2017-09-13 

Я хочу объединить эти два фрейма данных на основе идентификатора и даты, гдеразница между Date1 --dataframe1-- и Date2 --indataframe2 - меньше 15. Итак, мой желаемый фрейм данных в качестве вывода должен быть таким:

    ID   X1   X2    Date1.      Y1.  Y2.      Date2
   002  324  634  2016-01-01.   nan.  nan.     nan
   002  334  534  2016-01-14    1224  234   2016-01-04
   002  354  834  2016-01-30.   1254   249  2016-01-28
   004  543  843  2017-02-01    321   212   2015-12-01 
   004  923  043  2017-04-15.    nan   nan.   nan
   005  032  212  2015-09-01    nan   nan.   nan
   005  523  843  2015-09-15.   1121  222   2017-09-13
   005  212  222  2015-10-1.    nan   nan.   nan

1 Ответ

0 голосов
/ 26 декабря 2018

Таким образом, желаемый результат немного неправильный, поскольку одно из значений на 2 года старше объединенного значения.

Сначала мы выполняем объединение:

f = df.merge(df1, how='left', on='ID')

   ID   X1   X2       Date1    Y1   Y2       Date2
0   2  324  634  2016-01-01  1224  234  2016-01-04
1   2  334  534  2016-01-14  1224  234  2016-01-04
2   2  354  834  2016-01-30  1224  234  2016-01-04
3   4  543  843  2017-02-01   321  212  2016-12-01
4   4  923   43  2017-04-15   321  212  2016-12-01
5   5   32  212  2015-09-01  1121  222  2015-09-13
6   5  523  843  2015-09-15  1121  222  2015-09-13
7   5  212  222   2015-10-1  1121  222  2015-09-13

Затем мы создаем логическое значениемаска:

mask = (pd.to_datetime(f['Date1'], format='%Y-%m-%d') - pd.to_datetime(f['Date2'], format='%Y-%m-%d')).apply(lambda i: i.days <= 15 and i.days > 0)

0    False
1     True
2    False
3    False
4    False
5    False
6     True
7    False

Затем мы устанавливаем значение nan, если условие не совпадает:

f.loc[~mask, ['Y1', 'Y2', 'Date2']] = np.nan

   ID   X1   X2       Date1      Y1     Y2       Date2
0   2  324  634  2016-01-01     NaN    NaN         NaN
1   2  334  534  2016-01-14  1224.0  234.0  2016-01-04
2   2  354  834  2016-01-30     NaN    NaN         NaN
3   4  543  843  2017-02-01     NaN    NaN         NaN
4   4  923   43  2017-04-15     NaN    NaN         NaN
5   5   32  212  2015-09-01     NaN    NaN         NaN
6   5  523  843  2015-09-15  1121.0  222.0  2015-09-13
7   5  212  222   2015-10-1     NaN    NaN         NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...