Объедините два неравных кадра данных с частично общими элементами по двум индексам (дата, время и дата) - PullRequest
2 голосов
/ 29 сентября 2019

Я хотел бы объединить два кадра данных различной длины в двух столбцах, которые частично имеют общий элемент.

Индекс left_dataframe (A) имеет тип datetime, и одна и та же дата будет отображаться кратноно с разным временем (следовательно, index.date не помогает).

Индекс right_dataframe (B) имеет тип datetime.date, и каждая дата отличается, как и ожидалось.

A=pd.DataFrame({'datetime':['2019-06-01 18:11:55', '2019-06-01 21:43:02','2019-07-23 09:07:18', '2019-07-24 10:32:24'], \
                'value 1':[2, 5, 80, 0]})

B=pd.DataFrame({'date':['2019-06-01', '2019-07-23', '2019-07-24'], \
                'value 2':[10, 7, 3]})

Мне нужно объединить два кадра данных по датам и, в частности, поместить элементы B в строки, где появляется первая новая дата, и заполнить остальные одинаковые даты-разное с помощью 0, поэтомувывод должен быть примерно таким (вместе с комментариями):

           datetime  value 1  value 2
2019-06-01 18:11:55        2       10  #this is the first 2019-06-01 --> so it got the value of dataframe B
2019-06-01 21:43:02        5        0  #this is the second 2019-06-01 --> so the value 2 column got filled in with a 0 value
2019-07-23 09:07:18       80        7
2019-07-24 10:32:24        0        3

Ваш ввод более чем приветствуется ^ _ ^

1 Ответ

1 голос
/ 29 сентября 2019

Использование:

#convert columns to dates
B['date'] = pd.to_datetime(B['date']).dt.date
#convert to columns datetimes
A['datetime'] = pd.to_datetime(A['datetime'])

Создание новых столбцов - date с из datetime с в A на Series.dt.date для сопоставления с помощью B['date'] и вспомогательных столбцовдля слияния с дубликатами date s на GroupBy.cumcount:

A['date'] = A['datetime'].dt.date
A['g'] = A.groupby('date').cumcount()
B['g'] = B.groupby('date').cumcount()

#print (A)
#print (B)

Затем используйте DataFrame.merge с обоими столбцами и левым соединением, удалите вспомогательный столбеци преобразовать пропущенные значения добавленного столбца в 0 на Series.fillna:

df = A.merge(B, on=['date','g'], how='left').drop(['date','g'], axis=1)
df['value 2'] = df['value 2'].fillna(0, downcast='int')
print (df)
             datetime  value 1  value 2
0 2019-06-01 18:11:55        2       10
1 2019-06-01 21:43:02        5        0
2 2019-07-23 09:07:18       80        7
3 2019-07-24 10:32:24        0        3
...