python - np.logical_or 与 reduce 返回不同的结果
问题描述
np.logical_or
withfunctools.reduce
返回不同的结果。
kdf = pd.DataFrame(data={'col1' : [' False', 1, np.nan], 'dt': [datetime.now(), ' 2018-12-12', '2019-12-12'], 'bool':
[False, True, True], 'i': [1,2,'3'], 'bnan': [False, True, np.nan], 'col2': [' True ', False, 'False']})
print([kdf[i].str.contains('^\s*F') for i in ['col1', 'col2']])
# [0 True
# 1 NaN
# 2 NaN
# Name: col1, dtype: object, 0 False
# 1 NaN
# 2 True
# Name: col2, dtype: object]
你可以看到这返回了预期的输出,但是当我们用 重用它时np.logical_or
,它返回Nan
第三行而不是True
from functools import reduce
reduce(np.logical_or, [kdf[i].str.contains('^\s*F') for i in ['col1', 'col2']])
# 0 True
# 1 NaN
# 2 NaN
# dtype: object
但np.logical_or(np.nan, True)
回报True
。我希望reduce会将该函数应用于所有列表项,即
kdf['col1'].str.contains('^\s*F') | kdf['col2'].str.contains('^\s*F')
我错过了什么吗?
解决方案
我认为这是错误,对于使用 NaN 的正确处理应该将它们替换为一些 boolean ,例如False
通过na=False
参数:
from functools import reduce
a = reduce(np.logical_or, [kdf[i].str.contains('^\s*F') for i in ['col1', 'col2']])
print (a)
0 True
1 NaN
2 NaN
dtype: object
b = np.logical_or.reduce([kdf[i].str.contains('^\s*F') for i in ['col1', 'col2']])
print (b)
[True nan nan]
c = kdf['col1'].str.contains('^\s*F') | kdf['col2'].str.contains('^\s*F')
print (c)
0 True
1 False
2 False
dtype: bool
from functools import reduce
a = reduce(np.logical_or, [kdf[i].str.contains('^\s*F', na=False) for i in ['col1', 'col2']])
print (a)
0 True
1 False
2 True
dtype: bool
b = np.logical_or.reduce([kdf[i].str.contains('^\s*F', na=False) for i in ['col1', 'col2']])
print (b)
[ True False True]
c = kdf['col1'].str.contains('^\s*F', na=False) | kdf['col2'].str.contains('^\s*F', na=False)
print (c)
0 True
1 False
2 True
dtype: bool
推荐阅读
- architecture - 框架插件架构解决方案
- python - 如何根据开始和结束列表提取文本
- mybatis - MyBatis map-underscore-to-camel-case 不工作
- docker - 如何在 docker 镜像中添加 CA 根证书
- python - 如何在django中将不同功能的两个数据框写入一个excel文件
- c# - UWP 应用中的runFullTrust 模式是否默认支持broadFileAccess?
- sql - how do I return the sql data types from my query in pgsql?
- java - 如何读取 CSV 文件中的特定行
- javascript - 带有位置的垂直文本侧边栏:固定
- javascript - 如何将值从复选框数组传递到 3 个输入,而不覆盖