python - NaN 污染两个对象 DataFrame 列的 max()
问题描述
如果我取两列浮点数的最大值,即使有些是 NaN,结果也是相当可预测的:
>>> df = pd.DataFrame({"a": [1.0, 2.0, 3.0, 4.0],
"b": [3, 2, float("nan"), 9]})
>>> df
a b
0 1.0 3.0
1 2.0 2.0
2 3.0 NaN
3 4.0 9.0
>>> df.dtypes
a float64
b float64
dtype: object
>>> df[["a", "b"]].max(axis=1)
0 3.0
1 2.0
2 3.0
3 9.0
dtype: float64
虽然我不确定为什么 3.0 和 NaN 的最大值不是 NaN。
但是,如果列包含非浮点类型(此示例中为字符串),则 NaN 似乎完全污染了结果:
>>> df = pd.DataFrame({"a": ["1", "2", "3", "4"],
"b": ["3", "2", float("nan"), "9"]})
>>> df
a b
0 1 3
1 2 2
2 3 NaN
3 4 9
>>> df.dtypes
a object
b object
dtype: object
>>> df[["a", "b"]].max(axis=1)
0 NaN
1 NaN
2 NaN
3 NaN
dtype: float64
我预计 max() 调用的输出将是 3、2、NaN、9。
解决方案
您可以告诉 pandas 在 take 中包含什么.max()
,但只有float
、int
和boolean
是有效类型。没有将字符串隐式转换为数字类型,因此在取最大值时不包括df
类似的元素。"3"
唯一的数值NaN
是这样返回的。
要获得预期的结果,您首先需要将字符串转换为数字类型,例如,
df = df.astype(float)
然后提供skipna=False
包括NaN
:
df.max(axis=1, skipna=False)
推荐阅读
- encryption - HMAC 是否加密原始明文消息?
- javascript - cytoscape.js - 在父节点中添加自定义 svg 图标
- python - 无法在 Robot Framework 中打印日志
- vb.net - 尝试阅读文本,放入列表,然后在列表中比较,最后替换txt文件
- reactjs - 如何阻止设备访问 React 中的页面
- python - 无法使用 bluepy 和 Bluez 将多个 HC-08 连接到树莓派
- angular - Angular 2 - 在 Google 地图中创建多个矩形并刷新数据位置
- java - 故障转移后恢复连接,因为 HikariCP 未检测到数据库 DNS 更改
- java - Appium, Java-Client 重复类问题
- ruby-on-rails - docker-compose.yml 不适用于 Rails 应用程序