Почему тип столбца не может читаться как в настройках конвертера? - PullRequest
4 голосов
/ 21 февраля 2020

Я хочу прочитать CSV-файл со строковым типом для указанного столбца, файл данных находится здесь:

файл данных для проверки

Пожалуйста, загрузите и сохраните его как $HOME\cbond.csv (не может загрузить его в dropbox и на другой диск net из-за GFW, jianguoyun предоставит engli sh gui, создайте свою собственную бесплатную учетную запись и загрузите мой пример файла данных).

import pandas as df
df = pd.read_csv('cbond.csv',sep=',',header=0, converters={'正股代码':str})

Я делаю столбец 正股代码 в файле csv как строковый тип с конвертерами, проверяю тип данных всех столбцов с помощью df.info().

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 239 entries, 0 to 238
Data columns (total 17 columns):
代码       239 non-null int64
转债名称     239 non-null object
现价       239 non-null float64
涨跌幅      239 non-null float64
正股名称     239 non-null object
正股价      239 non-null float64
正股涨跌     239 non-null float64
转股价      239 non-null float64
回售触发价    239 non-null float64
强赎触发价    239 non-null float64
到期时间     239 non-null object
剩余年限     239 non-null float64
正股代码     239 non-null object
转股起始日    239 non-null object
发行规模     239 non-null float64
剩余规模     239 non-null object
转股溢价率    239 non-null float64
dtypes: float64(10), int64(1), object(6)

Почему столбец 正股代码 отображается как

   正股代码     239 non-null object

вместо

   正股代码     239 non-null string  

?

Обновление pandas:

sudo apt-get install --upgrade  python3-pandas
Reading package lists... Done
Building dependency tree       
Reading state information... Done
python3-pandas is already the newest version (0.19.2-5.1).

Попробуйте другие утверждения:

>>> import pandas as pd
>>> pd.__version__
'0.24.2'
>>> test_1  = pd.read_csv('cbond.csv',dtype={'正股代码':'string'})
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/pandas/core/dtypes/common.py", line 2011, in pandas_dtype
    npdtype = np.dtype(dtype)
TypeError: data type "string" not understood

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/pandas/io/parsers.py", line 702, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python3.5/dist-packages/pandas/io/parsers.py", line 429, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/local/lib/python3.5/dist-packages/pandas/io/parsers.py", line 895, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python3.5/dist-packages/pandas/io/parsers.py", line 1122, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python3.5/dist-packages/pandas/io/parsers.py", line 1853, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 490, in pandas._libs.parsers.TextReader.__cinit__
  File "/usr/local/lib/python3.5/dist-packages/pandas/core/dtypes/common.py", line 2017, in pandas_dtype
    dtype))
TypeError: data type 'string' not understood
>>> test_2  = pd.read_csv('cbond.csv',dtype={'正股代码':'str'})
>>> test_2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 239 entries, 0 to 238
Data columns (total 17 columns):
代码       239 non-null int64
转债名称     239 non-null object
现价       239 non-null float64
涨跌幅      239 non-null float64
正股代码     239 non-null object
正股名称     239 non-null object
正股价      239 non-null float64
正股涨跌     239 non-null float64
转股价      239 non-null float64
回售触发价    239 non-null float64
强赎触发价    239 non-null float64
到期时间     239 non-null object
剩余年限     239 non-null float64
转股起始日    239 non-null object
发行规模     239 non-null float64
剩余规模     239 non-null object
转股溢价率    239 non-null float64
dtypes: float64(10), int64(1), object(6)
memory usage: 31.8+ KB

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

До pandas 1.0.0, т. Е. Вашей версии 0.19, нет dtype string в pandas, может быть внутренне np.str или StringArray из numpy. который df.info() обрабатывает как объект dtype

https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html#text -данных-типов

enter image description here

1 голос
/ 01 марта 2020

Используя convert_dtypes, для которого требуется Pandas> = 1.0.2, он поддерживает преобразование столбцов в лучшие dtypes с использованием dtypes, поддерживающих pd.NA.

DO C: pandas .DataFrame.convert_dtypes

Попробуйте это:


import pandas as pd
df = pd.read_csv('cbond.csv')
dfn = df.convert_dtypes()
print(dfn)

"""
代码         Int64
转债名称      string
现价       float64
涨跌幅      float64
正股名称      string
正股价      float64
正股涨跌     float64
转股价      float64
回售触发价    float64
强赎触发价    float64
到期时间      string
剩余年限     float64
正股代码       Int64
转股起始日     string
发行规模     float64
剩余规模      string
转股溢价率    float64
dtype: object
"""

Кроме того, почему df = pd.read_csv('cbond.csv',sep=',',header=0, converters={'正股代码':str}) или df['正股代码'] = df['正股代码'].astype('string') не работают так, как мы хотим?

Это похоже на ошибку для меня / нас, но функция pandas.

Как бы то ни было, convert_dtypes исправила это для меня.

1 голос
/ 26 февраля 2020

Поможет ли присвоить dtype столбца после чтения файла csv?

df['正股代码'] = df['正股代码'].astype('string')

С новым pandas 1.0 String dtype находится в эксперименте. Подробнее здесь: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.StringDtype.html#pandas .StringDtype

Это сработало для меня:

test_df = pd.DataFrame(data={'numbers_column':np.nan,
                        'strings_column':['3_re', '4_re', '5_re','random_str']},
                  index=[1,2,3, 4])

## until here the dtype of strings_column is still object

test_df['strings_column'] = test_df['strings_column'].astype('string')

В качестве альтернативы, чтобы сразу прочитать его как строку при открытии файла, это сработало для я:

 test_2 = pd.read_csv(.....,
                dtype={'正股代码':'string'})
...