У меня есть следующий 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)
Не стоит отдельный ответ, но 'ФР [ "Vals"]. Fillna (df.groupby ("Cat") [ "Vals"]. Преобразования ("означают"))' позволит избежать изменения индекса. – DSM
Мне интересно, почему вы задали 'Cat' как индекс? Кажется, df ['Vals'] = df ['Vals']. Fillna (средства) произведут тот же результат без установки и сброса индекса. –
@JoeR: Это не потому, что Cat принимает значения «A» и «B». Ответчик хочет заполнить «nan» против A (или B) со средним значением, полученным из значений против A (или B) – Kartik