如何用两个列分组值的中值替换数据框中的空值?

我在 Python 中有一个数据框,其中包括个人在一周内使用某些食物的频率。我想清理我的数据框并用每个人使用的每个食物类别的中值频率替换空值。如何用每个人的每个食物类别的 meidan 替换空值?


user  ffq    food       food-category

 1     1     apple         fruit

 1     3     banana        fruit

 1     2     tomato      vegetables

 1   nan     carrot      vegetables

 1     3     potato      vegetables

 1    nan    peach        fruit

 2     3     apple        fruit

 2    nan    banana       fruit

 2     2     tomato       vegetables

 2     nan   carrot       vegetables

 2     3   peach          fruit

结果应该是这样的:


user  ffq    food       food-category

 1     1     apple         fruit

 1     3     banana        fruit

 1     2     tomato      vegetables

 1 **2.5**   carrot      vegetables

 1     3     potato      vegetables

 1   **2**   peach        fruit

 2     3     apple        fruit

 2   **3**   banana       fruit

 2     2     tomato       vegetables

 2   **2**   carrot       vegetables

 2     3     peach        fruit

如果有人可以提供帮助,我将不胜感激


慕妹3242003
浏览 102回答 2
2回答

侃侃无极

我猜你想用组的平均值而不是中位数填充缺失值。我们可以使用.fillna()with.groupby()和.transform()函数来通过一行代码完成此操作。首先,让我们创建包含所需列的 DataFrame。# Create a DataFramedf = 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 groupdf['ffq'] = df.groupby(['user', 'food-category']).transform(lambda x: x.fillna(x.mean()))    user   ffq   food-category0   1      1.0   fruit1   1      3.0   fruit2   1      2.0   vegetables3   1      2.5   vegetables4   1      3.0   vegetables5   1      2.0   fruit6   2      3.0   fruit7   2      3.0   fruit8   2      2.0   vegetables9   2      2.0   vegetables10  2      3.0   fruit该.transform()方法用于执行特定于组的计算,在这个例子中是平均值,它返回一个类似索引的对象。有关详细信息,请参阅用户指南。

梦里花落0921

这是你如何做到的。首先,我们需要对值进行排序,以便在使用 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()].indexdf['ffq'] = df['ffq'].fillna(value=srs)结果df.sort_index()    user    ffq     food    food-category0   1       1.0     apple   fruit1   1       3.0     banana  fruit2   1       2.0     tomato  vegetables3   1       2.5     carrot  vegetables4   1       3.0     potato  vegetables5   1       2.0     peach   fruit6   2       3.0     apple   fruit7   2       3.0     banana  fruit8   2       2.0     tomato  vegetables9   2       2.0     carrot  vegetables10  2       3.0     peach   fruit
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python