np.logical_or
с functools.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
. Я надеюсь, что сокращение применит эту функцию ко всем элементам списка, например:
kdf['col1'].str.contains('^\s*F') | kdf['col2'].str.contains('^\s*F')
Я что-то упустил?