根据documentation,我们得到DtypeWarning:如果数据包含int
和str
,则列(0)具有混合类型,建议设置low_memory = False,这删除警告。但是我的任务相反:定义具有混合类型的列!
起初,我想解析DtypeWarning消息,以便我可以理解哪些列具有混合类型,但是遇到很多困难,使我无法依赖DtypeWarning:
df = pd.DataFrame({'a': (['1'] * 100000 + ['X'] * 100000 + ['1'] * 100000), 'b': ['b'] * 300000})
df.to_csv('test.csv', index=False)
df2 = pd.read_csv('test.csv')
# DtypeWarning: Columns (0) have mixed types
df = pd.DataFrame({'a': ([1] * 10000 + ['X'] * 10000 + [1] * 10000) * 10, 'b': ['b'] * 300000})
df.to_csv('test.csv', index=False)
df2 = pd.read_csv('test.csv')
# No warning
它仍然具有混合类型,但是没有出现警告。如果我分析类型,所有这些都是str
。也就是说,即使我一个人也无法分析混合类型。
那么,如何获得具有混合类型的列?是否可以添加参数read_csv(mixed_types = True)并强制熊猫不隐藏所有数据集或至少10万行的混合类型?或有什么想法?
谢谢。
似乎pandas不允许知道哪些列具有混合类型,但相反,将混合类型隐藏在dtype object
后面且内部str
之下。 DtypeWarning作为规则的例外。 @pygo答案中的The link解释了DtypeWarning的随机性。
答案 0 :(得分:0)
它应该同时适用于行和列。
low_memory:布尔值,默认为True
内部对文件进行分块处理,从而降低了内存使用量 解析时,但可能是混合类型推断。确保不混 类型要么设置为False,要么使用dtype参数指定类型。 请注意,无论如何,整个文件都会读入单个DataFrame中, 使用chunksize或iterator参数以块形式返回数据。 (仅对C解析器有效)
这是确定性的-始终根据所得出的内容推断类型 在数据中。也就是说,内部块大小不是固定数字 行,而不是字节,因此是否可以混合使用dtype警告 或没有感觉会有点随机。
我认为您不应该为这些消息而烦恼,因为这些错误消息是通用的。
df2 = pd.read_csv('test.csv', engine='c', dtype={'FULL': 'str', 'COUNT': 'int'}, header=1)