问题描述
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