2015-10-31 2 views
4

У меня есть следующий dataframe:питона панда dataframe: заполнить пренебрежимо малых с условным средней

import numpy as np 
import pandas as pd 
df = pd.DataFrame(data={'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'], 
         'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]}) 

    Cat Vals 
0 A  1 
1 A  2 
2 A  3 
3 B  4 
4 B  5 
5 A NaN 
6 B NaN 

И я хочу индексы 5 и 6 наполняться условным средним «Vals» на основе «Кошка» столбец, а именно 2 и 4.5

следующий код работает отлично:

means = df.groupby('Cat').Vals.mean() 
for i in df[df.Vals.isnull()].index: 
    df.loc[i, 'Vals'] = means[df.loc[i].Cat] 

    Cat Vals 
0 A  1 
1 A  2 
2 A  3 
3 B  4 
4 B  5 
5 A  2 
6 B 4.5 

Но я Looki нг для что-то лучше, как

df.Vals.fillna(df.Vals.mean(Conditionally to column 'Cat')) 

Edit: Я нашел, что одна строка короче, но я до сих пор не счастлива с ним:

means = df.groupby('Cat').Vals.mean() 
df.Vals = df.apply(lambda x: means[x.Cat] if pd.isnull(x.Vals) else x.Vals, axis=1) 

ответ

3

Мы хотим «ассоциировать» Cat значения с отсутствующими местоположениями NaN. В Пандах такие ассоциации всегда выполняются через индекс. Поэтому естественно установить Cat как индекс:

df = df.set_index(['Cat']) 

Как только это сделано, то fillna работы по желанию:

df['Vals'] = df['Vals'].fillna(means) 

Для возврата Cat к колонке, вы могли бы затем использования курса reset_index:

df = df.reset_index() 

import pandas as pd 
import numpy as np 
df = pd.DataFrame(
    {'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'], 
    'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]}) 

means = df.groupby(['Cat'])['Vals'].mean() 
df = df.set_index(['Cat']) 
df['Vals'] = df['Vals'].fillna(means) 
df = df.reset_index() 
print(df) 

дает

Cat Vals 
0 A 1.0 
1 A 2.0 
2 A 3.0 
3 B 4.0 
4 B 5.0 
5 A 2.0 
6 B 4.5 
+3

Не стоит отдельный ответ, но 'ФР [ "Vals"]. Fillna (df.groupby ("Cat") [ "Vals"]. Преобразования ("означают"))' позволит избежать изменения индекса. – DSM

+1

Мне интересно, почему вы задали 'Cat' как индекс? Кажется, df ['Vals'] = df ['Vals']. Fillna (средства) произведут тот же результат без установки и сброса индекса. –

+1

@JoeR: Это не потому, что Cat принимает значения «A» и «B». Ответчик хочет заполнить «nan» против A (или B) со средним значением, полученным из значений против A (или B) – Kartik

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