np.logical_or с помощью Reduce возвращают другой результат - PullRequest
1 голос
/ 04 октября 2019

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')

Я что-то упустил?

1 Ответ

1 голос
/ 04 октября 2019

Я думаю, что это ошибка, для правильной обработки с NaN следует заменить их на некоторое логическое значение, например 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...