2 回答
TA贡献2051条经验 获得超10个赞
我猜你想用组的平均值而不是中位数填充缺失值。我们可以使用.fillna()with.groupby()和.transform()函数来通过一行代码完成此操作。首先,让我们创建包含所需列的 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']})
我们现在可以使用所需的插补方法填充缺失值,例如均值、中位数或众数。下面的插补是用平均值完成的,以获得问题中提到的结果。
# 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()方法用于执行特定于组的计算,在这个例子中是平均值,它返回一个类似索引的对象。有关详细信息,请参阅用户指南。
TA贡献1772条经验 获得超6个赞
这是你如何做到的。首先,我们需要对值进行排序,以便在使用 groupby 时它们以正确的顺序出现。接下来我们计算平均值,然后我们需要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)
结果
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
添加回答
举报