Выберите строки в DataFrame на основе значений в другом кадре данных и обновите один из столбцов значениями в соответствии со вторым DataFrame. - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть два DataFrames df и df1.

Основной DataFrame выглядит следующим образом:
DF:

    start   end price
0   A   Z   1
1   B   Y   2
2   C   X   3
3   A   Z   4
4   D   W   5

Второй DataFrame:
DF1:

start   end price
    0   A   Z   100
    1   B   Y   200

Я хочу, чтобы основной фрейм данных df обновлял значения в столбцах 'price' на основе начала и конца в df1.он должен обновить значение столбца для всех строк, имеющих одинаковые начало и конец, как в df1.DF:

start   end price
0   A   Z   100
1   B   Y   200
2   C   X   3
3   A   Z   100
4   D   W   5

(все AZ и BY в df должны быть обновлены).Есть ли в любом случае, я могу получить этот вывод?На самом деле у фреймов данных есть больше столбцов, но я хочу обновить только один столбец (например, «Цена»).

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

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

df=df.set_index(['start','end'])
df.update(df1.set_index(['start','end']))
df.reset_index()
Out[99]: 
  start end  price
0     A   Z  100.0
1     B   Y  200.0
2     C   X    3.0
3     A   Z  100.0
4     D   W    5.0
0 голосов
/ 21 сентября 2018

merge

df.drop('price', 1).merge(df1, 'left').fillna(df)

  start end  price
0     A   Z  100.0
1     B   Y  200.0
2     C   X    3.0
3     A   Z  100.0
4     D   W    5.0

  1. Я собираюсь слиться с ['start', 'end'], и эта досадная price встанет у меня на пути.Итак, я опускаю его.
  2. Мне нужно сохранить индекс df, потому что у меня есть повторение 'A' и 'Z'.Итак, я использую 'left' merge
  3. Теперь мои пропущенные элементы можно заполнить с помощью df
0 голосов
/ 21 сентября 2018

Сначала вы можете объединить:

s = df1.merge(df2, left_on=['start', 'end'], right_on=['start', 'end'], how='left')

Затем вы можете fillna и проиндексировать нужные столбцы:

s.assign(price=s.price_y.fillna(s.price_x))[['start', 'end', 'price']]

  start end  price
0     A   Z  100.0
1     B   Y  200.0
2     C   X    3.0
3     A   Z  100.0
4     D   W    5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...