熊猫:用组的模式填充na
Posted
技术标签:
【中文标题】熊猫:用组的模式填充na【英文标题】:Pandas: Fill na with mode of a group 【发布时间】:2021-08-31 06:08:36 【问题描述】:我有一个包含多个列的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])
如何仅基于Category
用模式填充Price_Category
上的NaN
?
我尝试使用:
df['Price_Category'] = df.groupby('Category')['Price_Category'].apply(lambda x: x.fillna(x.mode()[0]))
但我收到此错误:KeyError: 0
我尝试过的其他方法,开始用来自Store
的名称填充NaN
。
感谢您的帮助!
【问题讨论】:
请发布您的预期输出 【参考方案1】:使用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: index 0 is out of bounds for axis 0 with size 0 @FilipeCarvalho - 添加解决方案来回答。以上是关于熊猫:用组的模式填充na的主要内容,如果未能解决你的问题,请参考以下文章