Создайте функцию в python, которая будет вменять средние ИЛИ средние значения во фрейме данных pandas

#python #pandas #function #mean #median

Вопрос:

У меня есть фрейм данных

 data = {'Age':[18, np.nan, 17, 14, 15, np.nan, 17, 17]} 
df = pd.DataFrame(data) 
df
 

Я хотел бы написать решение, которое позволило бы вменить либо среднее, либо медиану,
используя

 df = df.fillna 
df = df.fillna(df.median())
 

Желаемый результат для среднего

 data = {'Age':[18, 16.3, 17, 14, 15, 16.3, 17, 17]} 
df = pd.DataFrame(data) 
df
 

Желаемый результат для медианы

 data = {'Age':[18, 17, 17, 14, 15, 17, 17, 17]} 
df = pd.DataFrame(data) 
df
 

Ответ №1:

Используйте функцию:

 def f(df, func):
    if func in ['mean','median']:
        return df.fillna(df.agg(func))
    else:
        raise Exception("Wrong function, use only 'mean' or 'median'")
    
 

При необходимости mean используйте:

 df = f(df, 'mean')
 

При необходимости median используйте:

 df = f(df, 'median')
 

Комментарии:

1. Спасибо, но как это работает? 🙂

2. @AnakinSkywalker — да, по df.replace('nan', np.nan)

3. Моя точка зрения — я хочу, чтобы у меня был выбор либо вменять средства, либо медианы, применяя функцию к столбцу.

4. @AnakinSkywalker — Не уверен, что понимаю, может быть, пробный неработающий код df = df.fillna необходимо удалить?

5. Ладно, понял! Спасибо за ваше время и усилия!

Ответ №2:

Первый разбор 'nan' как float :

 df = df.astype(float)
df = df.fillna(df.mean())
print (df)
 

Выход:

          Age
0  18.000000
1  16.333333
2  17.000000
3  14.000000
4  15.000000
5  16.333333
6  17.000000
7  17.000000
 

Для функции:

 def f(df, func):
    return df.fillna([df.mean(), df.median()][func == 'mean'])
 

Комментарии:

1. Спасибо, но как поместить это в функцию, в которой я буду вменять средства или медианы?

2. @AnakinSkywalker Отредактировал мой

3. Проголосовал, но принял первый ответ в хронологическом порядке 🙂

4. @AnakinSkywalker Ах, здорово!

Ответ №3:

Универсальное решение для всех столбцов сразу

 data = {'Age':[18, 'nan', 17, 14, 15, 'nan', 17, 17]} 
df = pd.DataFrame(data) 

df = df.astype('float')

def foo(s, func):
    val = func(s)
    return s.fillna(val)

df.apply(foo, args=(np.mean,))
 

или

 df.apply(foo, args=(np.median,))
 

или

 df.apply(foo, args(custom_function,))