Pandas如何使用groupby将NaN值替换为平均值?

3

我尝试使用groupby(client_id或client_name)来替换特征计数列(它是一个范围从1到10的整数)中的NaN值,然而这些NaN值似乎没有被替换。

df['feature_count'].isnull().sum()

输出结果为:

2254

现在我使用的是:

df['feature_count'].fillna(df.groupby('client_name')['feature_count'].mean(), inplace=True)

但是输出结果仍然相同:
df['feature_count'].isnull().sum()

2254

有没有其他方法可以用同一列中其他非NaN值的平均值来替换NaN值,这些值是按照它们的ID分组的?


1
你所使用的代码看起来有误,特别是 inplace=True 部分。先尝试获取平均值(存入一个变量中),然后再进行填充。如果你想让我们解决这个问题,你应该根据 [mcve] 提供你代码的样例。 - Anton vBR
我有500个客户端ID,这意味着我需要找到平均值500次,这不是很多工作吗? - Krishna Dhruv
1个回答

3

df['feature_count'].fillna(df.groupby('client_name')['feature_count'].transform('mean'), inplace=True)

这行代码可以将DataFrame中的空值用每个客户端的特征数均值填充。

s = df.groupby('client_name')['feature_count'].mean()
df['feature_count'].fillna(df['client_name'].map(s), inplace=True)

更加方便的方法是使用 pd.DataFrame.transform 函数,它可以为你处理映射部分:
s = df.groupby('client_name')['feature_count'].transform('mean')
df['feature_count'].fillna(s, inplace=True)

我尝试了你建议的方法,NaN值并没有完全消失,但它们从2254减少到了529。 - Krishna Dhruv
@KrishnaDhruv,猜测你的一些组可能全部为NaN,请检查你的输入。否则,你需要提供一个[mcve]。 - jpp
是的!一些组都是NaN。感谢你的见解和答案!!!:)) - Krishna Dhruv

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