Как выбрать строки в кадре данных Pandas, если любое значение не равно числу? - PullRequest
4 голосов
/ 12 октября 2019

Мне удалось отфильтровать строки данных Pandas, содержащие число:

import pandas as pd    

df = pd.DataFrame({'c1': [3, 1, 2], 'c2': [3, 3, 3], 'c3': [2, 5, None], 'c4': [1, 2, 3]})

   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2
2   2   3  NaN   3

df1 = df[(df.values == 1)]

   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2

Но если я попытаюсь отфильтровать, исключая число, я получу действительно странный результат с повторяющимися строками:

df1 = df[(df.values != 1)]

   c1  c2   c3  c4
0   3   3  2.0   1
0   3   3  2.0   1
0   3   3  2.0   1
1   1   3  5.0   2
1   1   3  5.0   2
1   1   3  5.0   2
2   2   3  NaN   3
2   2   3  NaN   3
2   2   3  NaN   3
2   2   3  NaN   3

Почему это? И как я могу отфильтровать только те строки, которые не содержат указанного числа?

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 12 октября 2019

Посмотрите на эту маску

In [88]: df.values != 1
Out[88]:
array([[ True,  True,  True, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True]])

Основа для нарезки по соглашению о numpy. Каждое True будет повторяться, поэтому у вас есть повторяющиеся строки в выводе. Вам нужно дополнительно all проверить каждую строку на всех True и вернуть по одному True / False для каждой строки.

df[(df.values != 1).all(1)]

Out[87]:
   c1  c2  c3  c4
2   2   3 NaN   3

Примечание: я собираюсь повторно использовать ваш код, поэтому я не сталне меняй это. Хотя краткий код должен быть.

df[(df != 1).all(1)]

или

df[df.ne(1).all(1)]
4 голосов
/ 12 октября 2019

Использование DataFrame.any :

df[~df.eq(1).any(axis=1)]

Вывод:

   c1  c2  c3  c4
2   2   3 NaN   3
1 голос
/ 12 октября 2019

В основном, используйте фильтр для создания индекса, обратного индекса, а затем выберите строки на основе этого индекса.

import pandas as pd    

df = pd.DataFrame({'c1': [3, 1, 2,   1, 3], 
                   'c2': [3, 3, 3,   2, 3], 
                   'c3': [2, 5, None,3, 3], 
                   'c4': [1, 2, 3,   1, 3]})
print(df)
# Create an index based on any row containing 1
index = df.values == 1
print(index)
# This reverses the index. 
# I.e. 
#[False False False  True] will equal False, since True is in the list
#[True False False False]  will equal False, since True is in the list
#[False False False False] will equal True,  since True is NOT in the list
index = [True if True not in l else False for l in index]
# Pick out only the rows where the index is true
df1 = df[index]
print(df1)
1 голос
/ 12 октября 2019

попробуйте это:

indexes = [x for x in range(len(list(df.values))) if 1 not in df.values[x]] # get indexes where 1 not appear
df.iloc[indexes]

вывод:

    c1  c2  c3  c4
2   2   3   NaN 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...