#python #pandas #dataframe
#python #панды #фрейм данных #pandas
Вопрос:
Я полностью застрял и не знаю, с чего начать. Я хочу написать функцию, которая заменяет значения нуля в столбце «возраст» значениями «возраст», где «год» одинаковый.
Вот пример фрейма данных с ожидаемым результатом:
Sample df:
'age' 'name' 'year'
0 John 2018
0 John 2019
23 John 2018
24 John 2019
Expected output:
'age' 'name' 'year'
23 John 2018
24 John 2019
23 John 2018
24 John 2019
Ответ №1:
Использовать Series.map
по строкам без 0
значений:
d = df[df['age'].ne(0)].set_index('year')['age'].to_dict()
df['age'] = df['year'].map(d)
print (df)
age name year
0 23 John 2018
1 24 John 2019
2 23 John 2018
3 24 John 2019
Если требуется сопоставление по 2 столбцам, используйте GroupBy.transform
с заменой 0
на NaN
:
df['age'] = df.replace(0, np.nan).groupby(['year','name'])['age'].transform('first')
print (df)
age name year
0 23.0 John 2018
1 24.0 John 2019
2 23.0 John 2018
3 24.0 John 2019
Ответ №2:
Вы можете использовать df.groupby
с df.replace
и GroupBy.bfill
:
In [1637]: import numpy as np
In [1638]: df.age = df.replace(0, np.nan).groupby('year').age.bfill()
In [1639]: df
Out[1639]:
age name year
0 23.0 John 2018
1 24.0 John 2019
2 23.0 John 2018
3 24.0 John 2019