Панды продвигают int для плавания при фильтрации - PullRequest
1 голос
/ 01 ноября 2019

Панды, кажется, продвигают от int до float при фильтрации. Я предоставил простой фрагмент ниже, но у меня есть гораздо более сложный пример, который, я считаю, это продвижение приводит к неправильной фильтрации, потому что она сравнивает floats. Это можно обойти? Я читал, что это изменение поведения между различными версиями панд - это, конечно, не так, как раньше.

Ниже вы можете видеть, что [4 13] и [5 14] меняется на [4.0 13.0]и [5.0 14.0].

In [53]: df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]})  
    ...: df2 = pd.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})                                                                                             

In [54]: df1                                                                                                                                                                
Out[54]: 
   col1  col2
0     1    10
1     2    11
2     3    12
3     4    13
4     5    14

In [55]: df2                                                                                                                                                                
Out[55]: 
   col1  col2
0     1    10
1     2    11
2     3    12

In [56]: df1[~df1.isin(df2)]                                                                                                                                                
Out[56]: 
   col1  col2
0   NaN   NaN
1   NaN   NaN
2   NaN   NaN
3   4.0  13.0
4   5.0  14.0

In [57]: df1[~df1.isin(df2)].dropna()                                                                                                                                       
Out[57]: 
   col1  col2
3   4.0  13.0
4   5.0  14.0

In [58]: df1[~df1.isin(df2)].dtypes                                                                                                                                         
Out[58]: 
col1    float64
col2    float64
dtype: object

In [59]: df1.dtypes                                                                                                                                                         
Out[59]: 
col1    int64
col2    int64
dtype: object

In [60]: df2.dtypes                                                                                                                                                         
Out[60]: 
col1    int64
col2    int64
dtype: object

1 Ответ

1 голос
/ 01 ноября 2019

Сравнение с плавающей точкой здесь не происходит. isin возвращает NaN для отсутствующих данных, и, поскольку вы используете numpy int64, результат будет приведен к float64.

В 0.24 панды добавили nullable integer dtype , который вы можете использовать здесь.


df1 = df1.astype('Int64')
df2 = df2.astype('Int64')

df1[~df1.isin(df2)]

   col1  col2
0   NaN   NaN
1   NaN   NaN
2   NaN   NaN
3     4    13
4     5    14

Просто имейте в виду, что если вы хотите использовать numpy операции над результатом, numpy будет рассматривать вышеупомянутое как массив с dtype object.

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