несовместимость любого и всех кадров данных pd

Об этом спрашивали на других форумах, но с упором на нан.

У меня есть простой фрейм данных:

 y=[[1,2,3,4,1],[1,2,0,4,5]]
 df = pd.DataFrame(y)

У меня возникают трудности с пониманием того, как работают все без исключения. Согласно документации pandas, «любой» возвращает «... является ли какой-либо элемент истинным по запрошенной оси».

Если я использую:

~(df == 0)
Out[77]: 
    0     1      2     3     4
0  True  True   True  True  True
1  True  True  False  True  True


~(df == 0).any(1)
Out[78]: 
0     True
1    False
dtype: bool

Насколько я понимаю, вторая команда означает: вернуть «True», если какой-либо элемент имеет значение «True» по запрошенной оси, и он должен возвращать «True», «True» для обеих строк (поскольку обе содержат хотя бы одно истинное значение), но вместо этого я получаю «True», «False». Это почему?


person Niccola Tartaglia    schedule 16.12.2017    source источник
comment
См. законы Де Моргана.   -  person Willem Van Onsem    schedule 16.12.2017
comment
о да, понял, спасибо.   -  person Niccola Tartaglia    schedule 16.12.2017


Ответы (2)


Python интерпретирует ваш вызов как:

~ ( (df == 0).any(1) )

Таким образом, он ** сначала оценивает any. Теперь, если мы посмотрим на df == 0, мы увидим:

>>> df == 0
       0      1      2      3      4
0  False  False  False  False  False
1  False  False   True  False  False

Значит, в первой строке такого True нет, во второй есть, так что:

>>> (df == 0).any(1)
0    False
1     True
dtype: bool

Теперь мы инвертируем это с помощью ~, поэтому False становится True и наоборот:

>>> ~ (df == 0).any(1)
0     True
1    False
dtype: bool

Если мы сначала отрицаем, мы видим:

>>> (~ (df == 0)).any(1)
0    True
1    True
dtype: bool

Оба имеют True, так как в обеих строках есть хотя бы один столбец со значением True.

person Willem Van Onsem    schedule 16.12.2017
comment
Идеально, в этом есть смысл. Спасибо за объяснение!! - person Niccola Tartaglia; 16.12.2017
comment
Спасибо вам обоим, Виллем и Джезраэль, отличные объяснения! - person Niccola Tartaglia; 16.12.2017

Вам нужен один (), потому что приоритет операторов:

print (df == 0)
       0      1      2      3      4
0  False  False  False  False  False
1  False  False   True  False  False

print (~(df == 0))
      0     1      2     3     4
0  True  True   True  True  True
1  True  True  False  True  True

print ((~(df == 0)).any(1))
0    True
1    True
dtype: bool

Так как:

print ((df == 0).any(1))
0    False
1     True
dtype: bool

print (~(df == 0).any(1))
0     True
1    False
dtype: bool
person jezrael    schedule 16.12.2017
comment
О да, это имеет смысл. Большое спасибо за быстрый ответ. - person Niccola Tartaglia; 16.12.2017