#python #pandas
#питон #панды
Вопрос:
Хотите заменить некоторые строки некоторых столбцов в более крупном pandas df данными в меньшем pandas df. Имена столбцов одинаковы в обоих. Пробовал использовать combine_first, но он обновляет только нулевые значения.
Например, допустим, df1.shape равен 100, 25, а df2.shape равен 10,5 df1
A B C D E F G ...Z Y Z
1 abc 10.20 0 pd.NaT
df2
A B C D E
1 abc 15.20 1 10
Теперь после замены df1 должен выглядеть так:
A B C D E F G ...Z Y Z
1 abc 15.20 1 10 ...
Для замены значений в df1 выполняется условие, при котором df1.A = df2.A и df1.B = df2.B
Как это может быть достигнуто самым простым способом? Любая помощь будет оценена по достоинству.
Комментарии:
1.
df1.update(df2)
?2.
@Quang Hoang
Можете ли вы, пожалуйста, привести пример update (), используя условия, которые я упомянул? Я не думаю, что простое выполнение df1.update (df2) поможет.3. О, я пропустил эту часть.
update
выравниваетindex/columns
, поэтому вы можете захотеть установитьA,B
в качестве индекса для обоих фреймов данных. В противном случае, я думаю, вам нужно слияние.4. Также
pd.concat([df1,df2]).groupby(['A','B']).first()
.
Ответ №1:
Не знаю, я действительно понял ваш вопрос, решает ли это вашу проблему?
df1 = pd.DataFrame(data={'A':[1],'B':[2],'C':[3],'D':[4]})
df2 = pd.DataFrame(data={'A':[1],'B':[2],'C':[5],'D':[6]})
new_df=pd.concat([df1,df2]).drop_duplicates(['A','B'],keep='last')
print(new_df)
выходной сигнал:
A B C D
0 1 2 5 6
Ответ №2:
Вы могли бы поиграть с мультииндексом. Сначала давайте создадим те фреймы данных, с которыми вы работаете:
cols = pd.Index(list(ascii_uppercase))
vals = np.arange(100*len(cols)).reshape(100, len(cols))
df = pd.DataFrame(vals, columns=cols)
df1 = pd.DataFrame(vals[:10,:5], columns=cols[:5])
Затем преобразуйте A и B в индексы:
df = df.set_index(["A","B"])
df1 = df1.set_index(["A","B"])*1.5 # multiply just to make the other values different
df.loc[df1.index, df1.columns] = df1
df = df.reset_index()