首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么列类型不能像在转换器的设置中那样读取?

为什么列类型不能像在转换器的设置中那样读取?
EN

Stack Overflow用户
提问于 2020-02-21 17:36:56
回答 3查看 359关注 0票数 4

我想读取指定列的字符串类型的csv文件,数据文件位于以下位置:

data file to test

请下载并保存为$HOME\cbond.csv(由于GFW的原因,无法上传到dropbox和其他网盘,建国云提供英文界面,创建自己的免费账号并下载我的样本数据文件)。

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

我使用转换器将csv文件中的列正股代码设置为字符串类型,并使用df.info()检查所有列的数据类型。

代码语言:javascript
复制
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)

为什么列正股代码显示为

代码语言:javascript
复制
   正股代码     239 non-null object

而不是

代码语言:javascript
复制
   正股代码     239 non-null string  

升级熊猫:

代码语言:javascript
复制
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).

尝试不同的语句:

代码语言:javascript
复制
>>> 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-01 20:53:51

通过使用需要Pandas>=1.0.2的convert_dtypes,它支持使用支持pd.NA的数据类型将列转换为最佳的数据类型。

文档:pandas.DataFrame.convert_dtypes

试试这个:

代码语言:javascript
复制
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')不能像我们想要的那样工作?

这对我/我们来说似乎是一个bug,但对熊猫来说却是一个特性。

不管怎样,convert_dtypes已经帮我解决了这个问题。

票数 1
EN

Stack Overflow用户

发布于 2020-02-26 05:21:56

在读取csv文件后分配列的数据类型是否有帮助?

代码语言:javascript
复制
df['正股代码'] = df['正股代码'].astype('string')

在新的pandas 1.0中,字符串dtype处于实验阶段。点击此处阅读更多信息:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.StringDtype.html#pandas.StringDtype

这对我很有效:

代码语言:javascript
复制
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')

或者,在打开文件时立即将其作为字符串读取,这对我来说很有效:

代码语言:javascript
复制
 test_2 = pd.read_csv(.....,
                dtype={'正股代码':'string'})
票数 1
EN

Stack Overflow用户

发布于 2020-02-27 16:40:44

pandas 1.0.0之前,也就是您的0.19版本之前,pandas中没有dtype string,内部可以是来自numpynp.strStringArraydf.info()将其视为对象dtype

https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html#text-data-types

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60335783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档