Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Как заменить значения int64, которые равны -1000, на Nan?

#python #excel #pandas #dataframe


Задача вроде простая, но уже третий час не могу решить ее... 

Есть .xls файл. В нем 3 столбца с типами: 

Column1      int64
Column2     object
Column3    float64
dtype: object


Я считываю файл и все значения, которые равны -1000, хочу заменить на Nan. 
Делаю это так: 

data = pd.read_excel('test.xlsx', sheet_name='test', na_values = [-1000])


Вот результат:



Как видите, столбцы с float64 заменяются на Nan, но int64 - нет. 
Я пробовал даже при считывании файла изменять тип Column1

data = pd.read_excel('test.xlsx', sheet_name='test', na_values = [-1000], dtypes
= {'Column1':np.float64})


Но результат не изменился.

Как в столбцах с типом int64 заменить на Nan значения -1000? 
    


Ответы

Ответ 1



Использование na_values = [-1000] - наиболее идиоматический способ замены константного значения на NaN, но тут есть нюансы... В Pandas исторически только float* типы данных могли содержать NaN, и если присвоить целочисленному столбцу одно значение NaN, он превратится во float: In [28]: df = pd.DataFrame({"a": [1, 2, 3]}) In [29]: df Out[29]: a 0 1 1 2 2 3 In [30]: df.loc[1, "a"] = np.nan In [31]: df Out[31]: a 0 1.0 1 NaN 2 3.0 In [32]: df.dtypes Out[32]: a float64 dtype: object В современных версиях Pandas добавили новый тип данных pandas.core.arrays.integer.Int64Dtype (или "Int64" - обратите внимание на большую первую букву), который может содержать NaN: In [42]: df = pd.DataFrame({"a": [1, 2, 3]}, dtype="Int64") In [43]: df Out[43]: a 0 1 1 2 2 3 In [44]: df.dtypes Out[44]: a Int64 dtype: object In [45]: df.loc[1, "a"] = np.nan In [46]: df Out[46]: a 0 1 1 NaN 2 3 In [47]: df.dtypes Out[47]: a Int64 dtype: object можно использовать этот тип данных в вашем случае: In [50]: pd.read_excel(filename, na_values=[-1000]) Out[50]: Col1 Col2 0 1 Male 1 2 Female 2 -1000 Male 3 2 Female 4 -1000 Female 5 3 Male In [52]: pd.read_excel(filename, na_values=[-1000], dtype={"Col1":"Int64"}) Out[52]: Col1 Col2 0 1 Male 1 2 Female 2 NaN Male 3 2 Female 4 NaN Female 5 3 Male In [53]: pd.read_excel(filename, na_values=[-1000]).dtypes Out[53]: Col1 int64 Col2 object dtype: object

Комментариев нет:

Отправить комментарий