#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