Объединение фреймов данных по уникальным значениям

#python #pandas #merge #unique

Вопрос:

У меня есть 2 фрейма данных. Один из них-это общий «шаблон» со столбцом дат, которые идут каждый час с этого момента до 4 дней с этого момента. В другом DF есть данные, такие как широта и долгота, в нем также есть столбец даты, но данные отображаются только каждые 3 часа. Мне нужно объединить оба фрейма данных, чтобы каждая пара lat/lon в df2 имела каждый час от df1.

 DF1                                DF2 
Date                 Shift         Latitude  Longitude   Date                 Temp
2021-10-18 01:00:00  a1            39.9      -99.3       2021-10-18 18:00:00  34
2021-10-18 02:00:00  a2            39.9      -99.3       2021-10-18 21:00:00  36
.....                              .............
2021-10-18 21:00:00  b2            39.9      -99.3       2021-10-19 00:00:00  32
 

Ожидаемый Конечный Кадр Данных

 Latitude Longitude Date                 Shift           Temp
39.9     -99.3     2021-10-18 01:00:00  a1              NaN
39.9     -99.3     2021-10-18 02:00:00  a1              NaN
.....
39.9     -99.3     2021-10-18 17:00:00  b2              NaN
39.9     -99.3     2021-10-18 18:00:00  b2              34
39.9     -99.3     2021-10-18 19:00:00  b2              NaN
 

В DF2 насчитывается 3088 уникальных пар Lat/Lon, и каждая из пар unqiue должна иметь столбец даты из 4 дней, считая час за часом. В моем окончательном DF должно быть 299 536 строк.

Комментарии:

1. Откуда b1 берутся ваши ожидаемые результаты?

2. Извините, что они должны были быть b2, они взяты из исходного фрейма данных DF1

3. df2.merge(df1, on='Date', how='outer') ?

4. Это работает для заполнения каждой даты в DF1. Однако каждая пара lat/lon в DF2 не имеет каждой даты в DF1.

Ответ №1:

Используйте слияние с параметрами » Как » и » вкл.». Из документов панды:

 df1 = pd.DataFrame({'a': ['foo', 'bar'], 'b': [1, 2]})
df2 = pd.DataFrame({'a': ['foo', 'baz'], 'c': [3, 4]})
df1.merge(df2, how='inner', on='a')
 

даст вам:

       a  b  c
0   foo  1  3
 

при использовании:

 df1.merge(df2, how='left', on='a')
 

даст вам:

       a  b  c
0   foo  1  3.0
1   bar  2  NaN