2 回答

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
我猜你想用組的平均值而不是中位數(shù)填充缺失值。我們可以使用.fillna()with.groupby()和.transform()函數(shù)來通過一行代碼完成此操作。首先,讓我們創(chuàng)建包含所需列的 DataFrame。
# Create a DataFrame
df = pd.DataFrame({'user':['1','1','1','1','1','1', '2', '2', '2', '2', '2'],
'ffq':[1, 3, 2, np.nan, 3, np.nan, 3, np.nan, 2, np.nan, 3],
'food-category':['fruit', 'fruit', 'vegetables', 'vegetables',
'vegetables', 'fruit', 'fruit', 'fruit', 'vegetables',
'vegetables', 'fruit']})
我們現(xiàn)在可以使用所需的插補(bǔ)方法填充缺失值,例如均值、中位數(shù)或眾數(shù)。下面的插補(bǔ)是用平均值完成的,以獲得問題中提到的結(jié)果。
# Apply fillna function within each group
df['ffq'] = df.groupby(['user', 'food-category']).transform(lambda x: x.fillna(x.mean()))
user ffq food-category
0 1 1.0 fruit
1 1 3.0 fruit
2 1 2.0 vegetables
3 1 2.5 vegetables
4 1 3.0 vegetables
5 1 2.0 fruit
6 2 3.0 fruit
7 2 3.0 fruit
8 2 2.0 vegetables
9 2 2.0 vegetables
10 2 3.0 fruit
該.transform()方法用于執(zhí)行特定于組的計(jì)算,在這個(gè)例子中是平均值,它返回一個(gè)類似索引的對(duì)象。有關(guān)詳細(xì)信息,請(qǐng)參閱用戶指南。

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是你如何做到的。首先,我們需要對(duì)值進(jìn)行排序,以便在使用 groupby 時(shí)它們以正確的順序出現(xiàn)。接下來我們計(jì)算平均值,然后我們需要NaN用我們提取的序列填充 s。
df = df.sort_values(['user','food-category'])
srs = df.dropna().groupby(['user','food-category']).agg({'ffq':'mean'})['ffq']
srs.index = df[df['ffq'].isnull()].index
df['ffq'] = df['ffq'].fillna(value=srs)
結(jié)果
df.sort_index()
user ffq food food-category
0 1 1.0 apple fruit
1 1 3.0 banana fruit
2 1 2.0 tomato vegetables
3 1 2.5 carrot vegetables
4 1 3.0 potato vegetables
5 1 2.0 peach fruit
6 2 3.0 apple fruit
7 2 3.0 banana fruit
8 2 2.0 tomato vegetables
9 2 2.0 carrot vegetables
10 2 3.0 peach fruit
添加回答
舉報(bào)