Сравнение двух фреймов данных Pandas строка за строкой и вставка соответствующего значения в другой фрейм данных

#python #pandas

Вопрос:

У меня есть два фрейма данных pandas с именами complete_data и raw_data. Мое намерение состоит в том, чтобы просмотреть столбец даты (строка за строкой) кадров данных raw_data в кадрах данных complete_data. Для строк фреймов данных raw_data, найденных в complete_data, я хочу вставить соответствующую строку в P1 и P2 в complete_data.

Пожалуйста, обратите внимание:

  1. Уникальным ключом в обоих кадрах данных является «дата», а фрейм данных complete_data содержит полный набор «дат», для получения которых из фрейма данных raw_data требуются другие столбцы.
  2. Я хочу, чтобы конечным кадром данных был кадр данных «complete_data» со значениями NaN, где дата не существует в кадре данных raw_data. И там, где существует «дата», строки в столбцах P1 и P2 должны быть вставлены в фрейм данных complete_data.

Вот мой образец кода:

 import pandas as pd import numpy as np complete_data = pd.DataFrame({'date':['2010-01-01','2010-01-02','2010-01-03','2010-01-04','2010-01-05','2010-01-06','2010-01-07','2010-01-08']})  raw_data = pd.DataFrame({'date':['2010-01-01','2010-01-02','2010-01-03','2010-01-05','2010-01-07','2010-01-08'],  'P1':['4.4','5.2','5.6','6.2','6.5','7.2'],  'P2':['200','220','230','250','270','280']})  column_labels = list(raw_data.columns) column_labels = column_labels[1:] complete_data[column_labels] = np.nan  i = 0 while ilt;raw_data.shape[0]:  if raw_data['date'].iloc[i] in complete_data['date'].iloc[i]:  complete_data.iloc[[i],[1,2]]=raw_data.iloc[[i],[1,2]]  else:  complete_data.iloc[[i],[1,2]] = raw_data.iloc[[i],[1,2]]  i =1  

Мой вывод таков:

 date P1 P2 0 2010-01-01 4.4 200 1 2010-01-02 5.2 220 2 2010-01-03 5.6 230 3 2010-01-04 6.2 250 4 2010-01-05 6.5 270 5 2010-01-06 7.2 280 6 2010-01-07 NaN NaN 7 2010-01-08 NaN NaN  

Мой ожидаемый результат должен быть:

 date P1 P2 0 2010-01-01 4.4 200 1 2010-01-02 5.2 220 2 2010-01-03 5.6 230 3 2010-01-04 NaN NaN 4 2010-01-05 6.2 250 5 2010-01-06 6.5 270 6 2010-01-07 NaN NaN 7 2010-01-08 7.2 280  

Ответ №1:

Ты мог бы сделать это:

За df:s, которые вы дали:

 date P1 P2 0 2010-01-01 4.4 200 1 2010-01-02 5.2 220 2 2010-01-03 5.6 230 3 2010-01-05 6.2 250 4 2010-01-07 6.5 270 5 2010-01-08 7.2 280  

и

 date P1 P2 0 2010-01-01 NaN NaN 1 2010-01-02 NaN NaN 2 2010-01-03 NaN NaN 3 2010-01-04 NaN NaN 4 2010-01-05 NaN NaN 5 2010-01-06 NaN NaN 6 2010-01-07 NaN NaN 7 2010-01-08 NaN NaN  
 df = complete_data.merge(raw_data, on =['date'], how='left').dropna(axis=1, how='all') df = df.rename(columns={'P1_y':'P1','P2_y':'P2'})  

что дает:

 date P1 P2 0 2010-01-01 4.4 200 1 2010-01-02 5.2 220 2 2010-01-03 5.6 230 3 2010-01-04 NaN NaN 4 2010-01-05 6.2 250 5 2010-01-06 NaN NaN 6 2010-01-07 6.5 270 7 2010-01-08 7.2 280  

Обратите внимание, что ожидаемый результат в вашем вопросе не соответствует определению данных, которые вы дали.

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

1. Большое вам спасибо за ваш быстрый ответ. Я вам очень благодарен. Ваш комментарий по поводу моего ожидаемого результата верен.

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