Использование apply () для разных столбцов с разными функциями в каждом столбце данных - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть DataFrame с именем столбца age,salary.Также есть некоторые значения NaN.Я хочу заполнить эти значения, используя Mean и Median.

Исходный фрейм данных


age salary
0   20.0    NaN
1   45.0    22323.0
2   NaN 598454.0
3   32.0    NaN
4   NaN 48454.0

Заполните пропущенные age с помощью mean() и salary с помощью median() их соответствующих столбцов, используя apply ().

Я использовал

df['age','salary'].apply({'age':lambda row:row.fillna(row.mean()), 'salary':lambda row:row.fillna(row.median()) })

Он показывает Key error 'age','salary' даже после того, как я использую axis=1

Ожидаемый вывод

    age salary
0   20.000000   48454.0
1   45.000000   22323.0
2   32.333333   598454.0
3   32.000000   48454.0
4   32.333333   48454.0

Может кто-нибудь показать мне, как это сделать правильно и что происходит в фоновом режиме?

Скажите, пожалуйста, есть ли и другие способы.Я учу панд с нуля

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Согласно документации , самый простой способ сделать это - передать словарь в качестве параметра value:

значение: скаляр, dict, Seriesили DataFrame

Значение, используемое для заполнения отверстий (например, 0), поочередно dict / Series / DataFrame значений, указывающих, какое значение использовать для каждого индекса (для Series) или столбца (для DataFrame).Значения, отсутствующие в dict / Series / DataFrame, заполняться не будут.Это значение не может быть списком.

, в вашем случае код будет следующим:

df.fillna(value={'age': df.age.mean(), 'salary': df.salary.median()}, inplace=True)

и даст:

         age    salary
0  20.000000   48454.0
1  32.333333   22323.0
2  45.000000  598454.0
3  32.333333   48454.0
4  32.000000   48454.0
5  32.333333   48454.0
1 голос
/ 28 сентября 2019

Как насчет вычисления пропущенных значений перед запуском команды apply?То есть вычислите среднее значение age и медиану salary, затем используйте (обратите внимание на дополнительные [] скобки, необходимые для работы с несколькими столбцами)

median_salary = df['salary'].median()
mean_age = df['age'].mean()

df[['age','salary']].apply({'age': lambda r: r.fillna(mean_age), 'salary': lambda r: r.fillna(median_salary)}) 

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

df[['age', 'salary']] = df[['age', 'salary']].apply(...)

Или, в вашем случае, когда вы просто хотите заполнить пропущенные значения, лучшим решением, вероятно, будет:

r.fillna({'age': mean_age, 'salary': median_salary}, inplace=True)
...