Почему Pandas Series.isin работает со строками, а не числами? - PullRequest
0 голосов
/ 25 октября 2018

Простой пример:

>>> df = pd.DataFrame(
         columns=['x', 'y', 'z'],
         data=np.array([
             ['a', 1, 'foo'],
             ['b', 2, 'bar'],
             ['c', 3, 'biz'],
             ['d', 99, 'baz'] ]))
>>> df
   x   y    z
0  a   1  foo
1  b   2  bar
2  c   3  biz
3  d  99  baz

>>> df[df.z.isin(['foo', 'biz'])]
   x  y    z
0  a  1  foo
2  c  3  biz

Это работает, как и ожидалось!

Однако сейчас я пытаюсь использовать y:

>>> df[df.y.isin([1,3])]
Empty DataFrame
Columns: [x, y, z]
Index: []

Что только что произошло?

Я ожидал, что будут выведены те же две строки, что и в приведенном выше примере .z.isin(...).

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Давайте посмотрим на источник проблемы.Это на самом деле вызов np.array.

np.array([['a', 1, 'foo'],
          ['b', 2, 'bar'],
          ['c', 3, 'biz'],
          ['d', 99, 'baz']])

Это фактически приводит целые числа к строкам:

array([['a', '1', 'foo'],
       ['b', '2', 'bar'],
       ['c', '3', 'biz'],
       ['d', '99', 'baz']], dtype='<U3')

Обратите внимание, что во втором столбце все строки, из-за приведения типов.OTOH, если вы инициализируете массив с явным dtype=object, отдельные типы сохраняются:

data = np.array([['a', 1, 'foo'],
                 ['b', 2, 'bar'],
                 ['c', 3, 'biz'],
                 ['d', 99, 'baz']], dtype=object)

df = pd.DataFrame(columns=['x', 'y', 'z'], data=data)
df.y.isin([1,3])

0     True
1    False
2     True
3    False
Name: y, dtype: bool

Или, что еще лучше, пропустите гетерогенный список списков (без преобразования в массив).

df = pd.DataFrame(data=[['a', 1, 'foo'],
                        ['b', 2, 'bar'],
                        ['c', 3, 'biz'],
                        ['d', 99, 'baz']], 
                  columns=list('xyz'))
df.y.isin([1,3])

0     True
1    False
2     True
3    False
Name: y, dtype: bool
0 голосов
/ 25 октября 2018

Если вы посмотрите на df.y, он имеет тип object, если вы преобразуете его в int, вы получите ожидаемое поведение

In [8]: df.y
Out[8]: 
0     1
1     2
2     3
3    99
Name: y, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...