#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
Комментариев нет:
Отправить комментарий