python - Pandas 均值函数返回所有 NaN
问题描述
我有这个数据框:
df = [{'A1':10, 'A2':''}, {'A1':11,'A2':110}, {'A1':12,'A2':120}]
而且我想平均忽略''(空字符串)值的不同列。
这是所需的输出
df_AVG = [{'A1':10, 'A2':'','avg':10}, {'A1':11,'A2':110,'avg': 60.5}, {'A1':12,'A2':120,'avg':66}]
我可以用这段代码做到这一点:
df['avg'] = df[['A1','A2']].mean(axis=1, numeric_only=True)
但是当我修改数据框并且它包含多个空格时,就像这样
df = [{'A1':10, 'A2':''}, {'A1':'','A2':110}, {'A1':12,'A2':120}]
我运行相同的代码,输出是这样的。所有 'avg' 值都是 NaN,包括以前有效的值:
df_AVG = [{'A1':10, 'A2':'','avg':NaN}, {'A1':11,'A2':110,'avg': NaN}, {'A1':12,'A2':120,'avg':NaN}]
你能告诉我这种方法有什么问题吗?谢谢!
解决方案
当您使用 numeric_only 时,它会“删除”非数字列,因此在第二种情况下,它会删除所有列,因为它们都是字符串。如果您更仔细地检查第一种情况的平均值,您会发现在第二行和第三行中,它只需要 11 和 12,因为 110 和 120 由于空字符串而被“删除”。
如果你愿意,你可以这样做:
df['avg'] = df[['A1','A2']].replace('', np.nan).apply(lambda row: np.nanmean(row), axis=1)
它用 NaN 替换 '' 并得到忽略那些 NaN 的平均值
推荐阅读
- c# - 如何在 ASP.Net / Kestrel 中启用 IFormFeature?
- node.js - 将带有 between 的 SQL 查询转换为 Sequelize
- android - 通过覆盖 react-native 中的 onKeyDown() 方法检测蓝牙耳机媒体按钮事件的问题
- firebase - 如何在数据可用之前等待数据 - 颤动
- javascript - django app for loop:views.py 还是前端?
- java - 以生产模式在 docker(-compose) 中启动 FusionAuth
- c++ - 如何使用缓冲区和二进制文件
- pandas - pyplot 记号太多,生成速度慢
- python - 密码和用户名正确,但我收到 SMTPAuthenticationError
- sql - 如果产品尚未售出,我如何取回产品数量?