熊猫:用组的模式填充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的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:drop_duplicates()。fillna没有填充零

用 pandas 数据框中另一列的值填充多列中的 Na

熊猫不会在原地填写na()

R:基于组的颜色的热图,灰色的 NA 值和包含的字符

Pandas:根据现有值的分布填充要填充的NA值

熊猫合并用空值填充新数据框