pandas.read_fwf игнорирует предоставленные dtypes - PullRequest
0 голосов
/ 01 ноября 2018

Я импортирую фрейм данных из текстового файла Я хотел бы указать тип данных столбцов, но панды, похоже, игнорируют ввод dtype.

Рабочий пример:

from io import StringIO
import pandas as pd

string = 'USAF   WBAN  STATION NAME                  CTRY ST CALL  LAT     LON      ELEV(M) BEGIN    END\n007026 99999 WXPOD 7026                    AF            +00.000 +000.000 +7026.0 20120713 20170822\n007070 99999 WXPOD 7070                    AF            +00.000 +000.000 +7070.0 20140923 20150926'

f = StringIO(string)

df = pd.read_fwf(f,
                 colspecs = [(0,6),
                             (7,12),
                             (13,41),
                             (43,45),
                             (48,50),
                             (51,55),
                             (57,64),
                             (65,73),
                             (74,81),
                             (82,90),
                             (91,101)],
                 dtypes = {'USAF'         : str,
                           'WBAN'         : str,
                           'STATION NAME' : str,
                           'CT'           : str,
                           'ST'           : str,
                           'CALL'         : str,
                           'LAT'          : float,
                           'LON'          : float,
                           'ELEV(M)'      : float,
                           'BEGIN'        : int,
                           'END'          : int,},
                 )
df.dtype

возвращает

USAF              int64
WBAN              int64
STATION NAME     object
CT               object
ST              float64
CALL            float64
LAT             float64
LON             float64
ELEV(M)         float64
BEGIN             int64
END               int64
dtype: object

Почему это происходит? Как заставить первые столбцы быть строками?

1 Ответ

0 голосов
/ 01 ноября 2018

Есть проблемы с преобразованием dtype с read_fwf. Это Панды угадывают тип и применение. Используйте converters здесь явно. Вы должны сделать это во время создания DataFrame, так как вы потеряете ведущие 0 s, если потом преобразуете.

string = 'USAF   WBAN  STATION NAME                  CTRY ST CALL  LAT     LON      ELEV(M) BEGIN    END\n007026 99999 WXPOD 7026                    AF            +00.000 +000.000 +7026.0 20120713 20170822\n007070 99999 WXPOD 7070                    AF            +00.000 +000.000 +7070.0 20140923 20150926'

f = StringIO(string)
df = pd.read_fwf(f,
                 colspecs = [(0,6),
                             (7,12),
                             (13,41),
                             (43,45),
                             (48,50),
                             (51,55),
                             (57,64),
                             (65,73),
                             (74,81),
                             (82,90),
                             (91,101)],
                converters = {'USAF':lambda x : str(x),
                              'WBAN':lambda x : str(x),
                              'STATION NAME':lambda x : str(x),
                              'CT':lambda x : str(x),
                              'ST':lambda x : str(x),
                              'CALL':lambda x : str(x)}
                 )
>>> df.dtypes
USAF             object
WBAN             object
STATION NAME     object
CT               object
ST               object
CALL             object
LAT             float64
LON             float64
ELEV(M)         float64
BEGIN             int64
END               int64
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...