Как заменить данные в одном pandas df на данные другого?

#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()