#python #pandas
Вопрос:
У меня есть два фрейма данных pandas с именами complete_data и raw_data. Мое намерение состоит в том, чтобы просмотреть столбец даты (строка за строкой) кадров данных raw_data в кадрах данных complete_data. Для строк фреймов данных raw_data, найденных в complete_data, я хочу вставить соответствующую строку в P1 и P2 в complete_data.
Пожалуйста, обратите внимание:
- Уникальным ключом в обоих кадрах данных является «дата», а фрейм данных complete_data содержит полный набор «дат», для получения которых из фрейма данных raw_data требуются другие столбцы.
- Я хочу, чтобы конечным кадром данных был кадр данных «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. Не забудьте отметить вопрос как принятый, если он соответствует вашим ожиданиям. Таким образом, это исчезнет из вопросов, на которые нет ответов.