Pandas字符串数据类型

3

我想为 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的建议,我进行了更新,使得这个方法更加简单易懂。我的真实数据集要大得多,但我想在导入时使用该方法为所有数据生成类型。


1
你尝试过制作一个更简单的数据集,只使用一两种数据类型来确定哪个是导致问题的原因吗? - BrenBarn
我会尝试解决这个问题,虽然它现在抛出的错误似乎表明(对于我这个新手来说)我没有正确指定,而不是我的规范和数据之间存在不匹配。但我会尝试并报告结果! - Don
1
pandas将会把指定的字符串类型,例如“S20”转换为代表字符串类型的“object”类型。这为什么是个问题呢?因为这是表示可变长度字符串的标准方式(实际上比固定的“S20”类型更有效率)。 - Jeff
你可以这样做,也可以指定特定的列(但是考虑到你有这么多列,可能可以在之后再处理)。 - Jeff
1
请查看文档(http://pandas.pydata.org/pandas-docs/dev/io.html#specifying-column-data-types),基本上是 dtype = {'column_1' : np.int32, 'column_2' : np.int64}。您不需要指定对象,因为字符串类型的列会自动处理。 - Jeff
显示剩余4条评论
1个回答

5

正如Jeff所指出的,我的语法很糟糕。名称和类型必须被压缩成一个字典样式的关系列表。下面的代码可以工作,但请注意,您无法为字符串宽度设置数据类型; 您只能将其定义为一个对象。

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)

1
没错,这就是我问简化的原因。我想如果你试图将其简化,你可能会发现它根本不起作用,即使对于数字类型(尽管我不确定)。然而,仍然很遗憾你不能指定实际的字符串数据类型。 - BrenBarn
1
pandas不支持内部字符串类型(实际上它们总是转换为object)。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接