#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть два фрейма данных со многими столбцами df1, df2, и я хочу заменить все значения df1 (кроме столбцов времени) данными из столбцов df2, где значения времени одинаковы:
df1:
index time x y ......many other columns ( the same as df2)
0 1 1 1
1 1.1 2 2
2 1.1 3 3
3 1.1 4 4
4 1.4 5 5
5 1.5 6 6
6 1.5 7 7
df2:
index time x y ....many other columns (the same as df1)
0 1 10 10
1 1.1 11 11
2 1.2 12 12
3 1.3 13 13
4 1.4 14 14
5 1.5 15 15
6 1.6 16 16
the result for df1 should be:
index time x y ....many other columns
0 1 10 10
1 1.1 11 11
2 1.1 11 11
3 1.1 11 11
4 1.4 14 14
5 1.5 15 15
6 1.5 15 15
Комментарии:
1. Вы могли бы просто объединить два фрейма данных и удалить первые столбцы фрейма данных.
Ответ №1:
Я думаю, что мне удалось привести в порядок свои мысли и, надеюсь, найти решение, которое будет работать для вас.
Попробуйте это, вы можете получить свой ответ с помощью using combine_first
и выполнить некоторые настройки:
combine_first
заполняет нулевые значения из другогоdataframe
, поэтому сначала вы можете заменить все значения (кроме столбца ‘time’) наnp.nan
. Обратите внимание, что я использую столбец ‘time’ в качествеindex
.- As
combine_first
вернет объединение двух фреймов данных, которое вы можете использоватьisin
для получения только значений времени изdf1
вашего конечного вывода.
import numpy as np
import pandas as pd
df1[df1.columns.difference(['time'])] = np.nan
res = df1.set_index('time').combine_first(df2.set_index('time')).reset_index()
li = [i for i in df1['time'].unique()]
final= res[res['time'].isin(li)]
Что даст вам:
time x y
0 1.0 10.0 10.0
1 1.1 11.0 11.0
2 1.1 11.0 11.0
3 1.1 11.0 11.0
6 1.4 14.0 14.0
7 1.5 15.0 15.0
8 1.5 15.0 15.0
Попробуйте это на вашем фактическом наборе данных и дайте мне знать, если это сработает.
Ответ №2:
Вам необходимо объединить:
df1 = df1.merge(df2, left_index = True, right_index = True)
затем вам нужно удалить ненужные столбцы
Комментарии:
1. разве это не вызвало бы ошибку? когда мы выполняем df1[‘time’], мы получим серию, а затем вызовем «merge», который является атрибутом фрейма данных
2. проблема с merge заключается в том, что он создает эти дополнительные столбцы с суффиксами _x, _y
3. Не проблема. Помогает различать происхождение похожих имен столбцов
4. К сожалению, это проблема для меня:( , эти суффиксы создадут проблемы в других частях программы
Ответ №3:
Редактировать: неправильно истолковал вопрос в первый раз. Это должно помочь:
df1[['time']].merge(df2, on='time')
Комментарии:
1. Не сработает, он удалит повторяющиеся значения времени из df1 (1.1, 1.1, 1.1), а также добавит значения, которых нет в df1 (например, он добавит время 1.6, которого нет в df1)
2. @Tenshi Вы понимаете код, который я опубликовал? Кажется, что вы не можете.
3. вы можете попробовать свой код с входными данными, которые я опубликовал в вопросе, вы увидите, что это не даст желаемого результата