Фрейм данных Python импортирует соответствующие данные столбцов и индексов

#python #pandas #dataframe

Вопрос:

У меня есть основной фрейм данных и вспомогательный фрейм данных. Оба имеют один и тот же индекс метки времени и столбцы, при этом у главного есть еще несколько столбцов. Я хочу скопировать данные определенного столбца из aux в master.

Мой код:

 maindf = pd.DataFrame({'A':[0.0,NaN],'B':[10,20],'C':[100,200],},index=pd.date_range(start='2020-05-04 08:00:00', freq='1h', periods=2))
auxdf= pd.DataFrame({'A':[1,2],'B':[30,40],},index=pd.date_range(start='2020-05-04 08:00:00', freq='1h', periods=2))

maindf = 
                       A   B    C
2020-05-04 08:00:00  0.0  10  100
2020-05-04 09:00:00  NaN  20  200

auxdf = 
                     A   B
2020-05-04 08:00:00  1  30
2020-05-04 09:00:00  2  40
 

Ожидаемый ответ: Я хочу взять данные столбца A в auxdf и скопировать в maindf, сопоставив индекс.

 maindf = 
                     A   B    C
2020-05-04 08:00:00  1  10  100
2020-05-04 09:00:00  2  20  200
 

Мое решение:

 maindf['A'] = auxdf['A']
 

Мое решение неверно, потому что я копирую значения напрямую, не проверяя соответствие индекса. как мне найти решение?

Ответ №1:

Вы можете использовать .update() , как показано ниже:

 maindf['A'].update(auxdf['A'])
 

.update() использует значения, отличные от NA, из переданных рядов для внесения обновлений. Выравнивается по индексу.

Обратите также внимание, что исходный dtype maindf['A'] сохраняется: остается float типом, даже если auxdf['A'] имеет int тип.

Результат:

 print(maindf)

                       A   B    C
2020-05-04 08:00:00  1.0  10  100
2020-05-04 09:00:00  2.0  20  200
 

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

1. таким образом, .update() заменяет все значения в maindf, независимо от того, являются ли они nan или плавающими, значениями из auxdf. Верно?

2. @Mainland Он обновляет только соответствующие индексы / индексы (индексы строк и столбцов для фрейма данных). Следует отметить, что он принимает только значение, отличное от NA, из вспомогательного df / ряда.

3. @Mainland Вы можете обратиться к ссылке, которую я привел выше, для Series.update() получения дополнительных примеров операций с сериями. Также смотрите документ DataFrame.update() для примеров для фрейма данных.