【问题标题】:pandas string data typespandas 字符串数据类型
【发布时间】:2013-09-30 23:40:54
【问题描述】:

我想为 pandas read_csv 指定数据类型。下面快速浏览一些在指定类型时有效但无效的东西。为什么后者不起作用?

import io
import pandas as pd

csv = """foo,1234567,a,1 
foo,2345678,b,3 
bar,3456789,b,5 
"""

df = pd.read_csv(io.StringIO(csv),
        names=["fb", "num", "loc", "x"])

print(df)

df = pd.read_csv(io.StringIO(csv),
        names=["fb", "num", "loc", "x"], 
        dtype=["|S3", "np.int64", "|S1", "np.int8"])

print(df)

我进行了更新,以使其更简单,并且希望更清楚地了解 BrenBarn 的建议。我的真实数据集要大得多,但我想使用该方法在导入时为我的所有数据生成类型。

【问题讨论】:

  • 您是否尝试过制作更简单的数据集并尝试仅使用一种或两种数据类型来查看是哪一种导致了问题?
  • 我会这样做,尽管它现在抛出的错误表明(对我的新手来说)我没有正确指定,而不是我的规范和数据之间存在不匹配。但我会试一试并报告!
  • pandas 会将指定的字符串 dtype,如 S20 转换为代表字符串类型的 object dtype。为什么这是个问题?这是表示可变长度字符串的标准方式(实际上比固定的S20 dtype 更有效)
  • @Jeff 哦,酷。所以如果objectstring_ 类型更有效,那么我对那件作品很满意。不过,我想将所有整数类型指定为 int32 或更少,而不是 int64。我想我可以尝试在导入后转换它们。
  • docs,基本上是dtype = { 'column_1' : np.int32, 'column_2' : np.int64 }。您不需要指定对象,因为对于类似字符串的列会自动发生这种情况

标签: python numpy pandas


【解决方案1】:

正如 Jeff 所说,我的语法很糟糕。名称和类型必须压缩到 dic 样式的关系列表中。下面的代码有效,但请注意,您不能输入字符串宽度;您只能将其定义为对象。

import pandas as pd
import io

csv = """foo,1234567,a,1
foo,2345678,b,3
bar,3456789,b,5
"""

df = pd.read_csv(io.StringIO(csv),
        names = ["fb", "num", "ab", "x"], 
        dtype = {"fb" : object, "num" : np.int64, "ab" : object, "x" : np.int8})
print(df)

【讨论】:

  • 对,这就是我询问简化的原因。我在想,如果您尝试将其简化,您可能会发现它根本不起作用,即使对于数字类型也是如此(尽管我不确定)。但是,您无法指定实际的字符串 dtype 似乎仍然很蹩脚。
  • pandas 不支持内部字符串类型(实际上它们总是被转换为对象)。
猜你喜欢
  • 2019-02-21
  • 2021-11-02
  • 1970-01-01
  • 2023-03-09
  • 2016-11-14
  • 2021-07-06
  • 2017-03-13
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多