How can .mean() exclude NaN values inside aggregate function?
我的数据集有很多列。这是两个:
1 2 3 4 5 6
| Index Graduated Age
0 College 24
1 HighSch 18
2 College 26
3 College Nan
4 HighSch 20 |
年龄的平均值很简单:
但是,我还有许多其他列,因此我正在使用agg():
1
| df.groupby('Graduated').agg({'Age':'mean'}) |
我得到的错误:
No numeric types to aggregate
If I insert a number instead of NaN, it works!!
如果列具有NaN值,agg()函数是否不允许我们运行均值?有办法解决吗?
- 从外观上看,它不是" number " nan,而是字符串"Nan"。将其从numpy更改为np.nan,它应该可以工作。
-
请参阅stackoverflow.com/questions/25039328/…,以获取针对您特定问题的答案,但不包括@ayhan提及的"Nan"问题
正如@ayhan所说,Nan值看起来像字符串。一种可能的解决方案是,您可以使用以下两行之一用实际的Nan值替换您拥有的Nan字符串:
df['Age'] = df['Age'].replace(r'Nan', np.nan, regex=True)
@ayhan的建议是使用to_numeric方法。
df['Age'] = pd.to_numeric(df['Age'], errors='coerce')
然后执行您在问题中提到的聚合。而且,我将对所有列进行相同的操作,以避免造成混淆,并从一开始就将事情弄清楚,以备将来进行分析。
- 如果dtype是object,则可能仍需要df["age"] = pd.to_numeric(df["age"], errors="coerce")。
-
我尝试过并给了我ValueError: Unable to parse string"Nan" at position 3
-
那行得通,您要我将其添加到答案中吗?
-
当然,那会很好。
-
让我们继续聊天中的讨论。
-
那行得通。谢谢@ayhan。我应该担心我必须使用errors = \\'coerce \\'吗?较新版本的pandas会使我的解决方案过时吗?
-
@AdamSchroeder在转换之前,您可以执行df['Age'][pd.to_numeric(df['Age'], errors='coerce').isnull()],这将向您显示哪些单元格被强制为nan。