Pandas:使用分组的众数填充缺失值

4

我有一个包含多列的df

df = pd.DataFrame({'Store':['M1','M2','M3','M1','M1','M2','M2','M3','M3'],
                   'Category':['A','A','A','B','B','B','C','C','C'],
                   'Price_Category':[np.nan,X,np.nan,np.nan,Y,Y,Z,np.nan,Z]})

我该如何使用众数填充Price_Category中的NaN,只基于Category

我尝试过使用以下代码:

df['Price_Category'] = df.groupby('Category')['Price_Category'].apply(lambda x: x.fillna(x.mode()[0]))

但我遇到了这个错误:KeyError:0

其他我尝试的方法是用Store中的名称来填充NaN

感谢您的帮助!


请发布您期望的输出 - sammywemmy
1个回答

3

使用 Series.iat 来按位置获取 Series 的第一个值:

f = lambda x: x.fillna(x.mode().iat[0])
df['Price_Category'] = df.groupby('Category')['Price_Category'].apply(f)

print (df)
  Store Category Price_Category
0    M1        A              X
1    M2        A              X
2    M3        A              X
3    M1        B              Y
4    M1        B              Y
5    M2        B              Y
6    M2        C              Z
7    M3        C              Z
8    M3        C              Z

如果出现错误:

IndexError:数组的大小为0,因此轴0的索引0超出范围

这意味着只有一个或多个组具有NaN(更改数据以引发错误):

df = pd.DataFrame({'Store':['M1','M2','M3','M1','M1','M2','M2','M3','M3'],
                   'Category':['A','A','A','B','B','B','C','C','C'],
                  'Price_Category':[np.nan,'X',np.nan,np.nan,'Y','Y',np.nan,np.nan,np.nan]})

#test if at least one non NaN else return same values (NaNs)
f = lambda x: x.fillna(x.mode().iat[0]) if x.notna().any() else x
df['Price_Category'] = df.groupby('Category')['Price_Category'].apply(f)

print (df)
  Store Category Price_Category
0    M1        A              X
1    M2        A              X
2    M3        A              X
3    M1        B              Y
4    M1        B              Y
5    M2        B              Y
6    M2        C            NaN
7    M3        C            NaN
8    M3        C            NaN

仍然有错误:IndexError:轴0的索引0超出了大小为0的范围 - Filipe Carvalho
@FilipeCarvalho - 已添加解决方案以回答。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接