2016-09-14 3 views
0

Это фрагмент dataframe у меня есть:Как использовать пользовательскую функцию fillna() в панд

Title | Age  
------+-------- 
Mr. | 30 
Mr. | NaN 
Mr. | 32 
Mrs. | 28 
Mrs. | 16 
Mr. | 34 
Mrs. | NaN 

Edit: я добавил последнюю строку, чтобы прояснить вопрос

Я хочу для обозначения NaNs (второй и последней строки), для второго ряда он должен использовать среднее значение другого «г-на», в dataframe, так что в этом случае, должно быть 32, в последней строке следует использовать среднее значение другой «миссис», так должно быть 22

Для вычисления среднего значения так же легко, как делать

value = df.loc[df["Title"] == "Mr."]["Age"].mean() 

Так что я написал функцию под названием agefun:

def agefun(df, t): 
    return df.loc[df["Title"] == t]["Age"].mean() 

И это работает, теперь, как я могу использовать эту функцию с функцией fillna()? Я хотел бы что-то вроде:

df['Age'].fillna(agefun(df, this_row_title)) 

Но, конечно, это не работает, я не знаю, как сказать функцию мне нравится значение, соответствующее название в этой конкретной строке.

Как это можно сделать?

ответ

2

Transform сохраняет ту же форму, что и исходная серия в dataframe.

df['Age'] = df.groupby('Title').transform(lambda group: group.fillna(group.mean())) 

>>> df 
    Title Age 
0 Mr. 30 
1 Mr. 32 # (30 + 32 + 34)/3 = 32 
2 Mr. 32 
3 Mrs. 28 
4 Mrs. 16 
5 Mr. 34 

В приведенном выше примере, он сохраняет все значения неизменными в течение одной NaN значения на второй строке которой он заполняет путем вычисления среднего значения для группы, за исключением, то есть среднее значение всех строк, где Title есть Mr..

+1

Спасибо много он работал отлично, но мне пришлось изменить его на: 'ФР [ 'Возраст '] = df.groupby (' Title ') ["Age"]. transform (lambda group: group.fillna (group.mean())) Это потому, что у меня есть другие числовые значения в строке. Таким образом, похоже, что он вычислялся на основе всех чисел в строке – luisfer

0

Вы также можете сделать это следующим образом:

df['Age'] = df['Age'].fillna(df.loc[df['Title'] == 'Mr.', 'Age'].mean()) 

df выход:

Age Title 
0 30.0 Mr. 
1 32.0 Mr. 
2 32.0 Mr. 
3 28.0 Mrs. 
4 16.0 Mrs. 
5 34.0 Mr. 
+2

Нет, это не сработает, потому что, если у меня есть «миссис», с NaN он заполнит его значение средним значением «г-н», спасибо много! – luisfer

+0

@luisfer. Проблема в том, что вы отредактировали свой вопрос после того, как я отправил свой ответ на ваш первоначальный вопрос. –

+0

Да, мне жаль, что в начале я не был более ясен, я искал более общего автора, чтобы приписать несколько недостающих значений, а не конкретный. Если бы я искал конкретный «df [« Age »] [2] = 32' будет прямым ответом. Благодаря! – luisfer

Смежные вопросы