Заменить значения на основе индекса панды - PullRequest
0 голосов
/ 17 октября 2018

Я работаю с набором данных, из которого подмножество имеет начальные и конечные значения.Я создал id, который позволяет мне идентифицировать эти наблюдения, поэтому после применения этого:

df['aux']=df.duplicated(subset=['id'], keep=False)

df_dup=df_dup[df_dup.aux==True]
df_dup.sort_values(by='id').reset_index(inplace=True)

я получаю что-то вроде этого:

index     id    status    value
  88      1    'initial'    8
  95      1    'final'      12
  63      2    'initial'    9
  52      2    'final'      13

Что я хочу достичь, это заменитьпоследнее значение в начальном значении:

index     id    status    value
  88      1    'initial'    12
  95      1    'final'      12
  63      2    'initial'    13
  52      2    'final'      13

Я пробовал несколько вещей, моя последняя попытка была такой:

df_dup[df_dup.status=='initial'].reset_index().value= \
df_dup[df_dup.status=='final'].reset_index().value

Но это заполняет initial значения nan:

index     id    status    value
  88      1    'initial'    nan
  95      1    'final'      12
  63      2    'initial'    nan
  52      2    'final'      13

Чего мне не хватает?Спасибо

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Без groupby и база на вашем drop_duplicates

df.value=df.id.map(df.drop_duplicates('id',keep='last').set_index('id').value)
df
Out[436]: 
   index  id     status  value
0     88   1  'initial'     12
1     95   1    'final'     12
2     63   2  'initial'     13
3     52   2    'final'     13
0 голосов
/ 17 октября 2018

Используйте GroupBy.transform с last - он также заменяет уникальные значения id, но возвращает то же значение:

df['value'] = df.groupby('id')['value'].transform('last')
print (df)
   index  id     status  value
0     88   1  'initial'     12
1     95   1    'final'     12
2     63   2  'initial'     13
3     52   2    'final'     13

Еслихотите заменить только дублированные id строки (много уникальных значений, поэтому производительность выше):

mask = df.duplicated(subset=['id'], keep=False)
df.loc[mask, 'value'] = df[mask].groupby('id')['value'].transform('last')
...