Как обновить столбец панд, если они имеют одинаковое значение столбцов? - PullRequest
3 голосов
/ 28 марта 2019

Допустим, у меня есть два оригинальных DataFrame вроде:

df1 = pd.DataFrame({"ID": [101, 102, 103], "Price":[12, 33, 44], "something":[12,22,11]})
df2 = pd.DataFrame({"ID": [101, 103], "Price":[122, 133]})

И это отображается как:

    ID  Price  something
0  101     12          12
1  102     33          22
2  103     44          11

И

    ID  Price
0  101    122
1  103    133

С тех пор я не устанавливаю никаких индексов для любого столбца, поэтому я хочу знать, как я могу обновить df1, если оба DataFrame имеют одинаковый ID. Надеюсь, что для этого примера я смогу получить такой результат:

    ID  Price  something
0  101     122          12
1  102     33           22
2  103     133          11

Вы можете видеть, я забочусь только о ценовой колонке. Что я пробовал сейчас:

pd.concat([df1,df2]).drop_duplicates(['ID'],keep='last') 

Но это просто показывает мне:

    ID  Price  something
1  102     33        22.0
0  101    122         NaN
1  103    133         NaN

Я не хочу, чтобы изменялись значения других столбцов.

Я бы хотел сохранить порядок строк df1.

UPDATE

После запуска кода ответа, и я продолжаю пробовать больше, и я нахожу, что порядок столбцов изменится, так как мы используем reset_index, что-то с индексом. поэтому я надеюсь, что кто-то может указать мне, как сохранить исходную позицию моего DataFrame. На данный момент это выглядит так:

In [180]: df1 = pd.DataFrame({"ss":[12,22,11], "ID": [101, 102, 103], "Price":[12, 33, 44], "something":[12,22,11]}) 
     ...: df2 = pd.DataFrame({"ID": [101, 103], "Price":[122, 133]}) 



In [181]: df1.set_index('ID',inplace=True) 
     ...: df1.update(df2.set_index('ID')) 
     ...: df1.reset_index(inplace=True)                                                                                                                                                                                                       

In [182]: df1                                                                                                                                                                                                                                 
Out[182]: 
    ID  ss  Price  something
0  101  12  122.0         12
1  102  22   33.0         22
2  103  11  133.0         11

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Используя np.where и isin, обновите цену в df1 после merge

df1.Price=np.where(df1.ID.isin(df2.ID),df1.merge(df2,on='ID',how='left')['Price_y'],df1.Price)

df1

    ID  Price  something
0  101  122.0          12
1  102   33.0          22
2  103  133.0          11

Использование update:

df1.set_index('ID',inplace=True)
df1.update(df2.set_index('ID'))
df1.reset_index(inplace=True)

df1 
    ID  Price  something
0  101  122.0          12
1  102   33.0          22
2  103  133.0          11
1 голос
/ 28 марта 2019

Другим возможным решением может быть использование Объединение_first ()

df2.set_index(['ID']).combine_first(df1.set_index(['ID', 'something'])).reset_index()

А также с помощью isin ()

df1.loc[df1.ID.isin(df2.ID), ['Price']] = df2[['Price']].values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...