Как отфильтровать серию панд?

Я хочу отфильтровать серию Pandas, чтобы удалить определенные значения. Это кажется такой простой задачей, но предпочтительный ответ на тот же вопрос мне не подходит.

Вот мой воспроизводимый пример:

data = np.array([['','Col1','Col2'],
                ['Row1',1,2],
                ['Row2',3,4]])

myDF = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])

mySeries = myDF.loc[:, "Col1"]
mySeries[mySeries != 1]

Я ожидаю, что последняя строка выведет единственную строку, содержащую значение 3, но вместо этого я получаю:

Row1    1
Row2    3
Name: Col1, dtype: object

Что я делаю неправильно?

1
0
80
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ваш Series содержит строки.

>>> mySeries.tolist()
>>> ['1', '3']

Вы можете использовать

>>> mySeries[mySeries != '1']
>>> 
Row2    3
Name: Col1, dtype: object

Это происходит потому, что массивы numpy содержат один тип данных, поэтому целые числа преобразуются в строки при создании data.

Если вам нужны целые числа, вы можете использовать

>>> mySeries = mySeries.astype(int)
>>> mySeries
>>> 
Row1    1
Row2    3
Name: Col1, dtype: int64

и ваш исходный код будет работать нормально.

mySeries = mySeries.astype(int)
mySeries.loc[mySeries != 1]
mySeries = pd.to_numeric(mySeries)

..это исправит это

Ответ принят как подходящий

Рассмотрим dtype создаваемого массива NumPy:

data = np.array([['','Col1','Col2'],
                 ['Row1',1,2],
                 ['Row2',3,4]])

print(data)

array([['', 'Col1', 'Col2'],
       ['Row1', '1', '2'],
       ['Row2', '3', '4']], 
      dtype='<U4')

Комбинирование строк и целых чисел во вложенном списке перед подачей в np.array создает массив строк, о чем свидетельствует '<U4', который представляет максимальное количество символов.

Если вы вместо этого используете списки, вы не столкнетесь с этой проблемой, поскольку реализация гарантирует, что массив будет создан с соответствующими типами:

data = [['','Col1','Col2'],
        ['Row1',1,2],
        ['Row2',3,4]]

myDF = pd.DataFrame(data=[i[1:] for i in data[1:]],
                    index=[i[0] for i in data[1:]],
                    columns=data[0][1:])

Другие вопросы по теме