Pandas:用组的模式填充 na

问题描述

我有一个包含多列的 df

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

如何仅基于 NaN 使用模式填充 Price_Category 上的 Category

我尝试使用:

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

但我收到此错误KeyError: 0

我尝试过的其他方法,开始用 NaN 中的名称填充 Store

感谢您的帮助!

解决方法

按位置使用 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','M3'],'Category':['A','A','B','C','C'],'Price_Category':[np.nan,'X',np.nan,'Y',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