如果我需要获取混合类型的列怎么办?

时间:2018-10-20 12:27:06

标签: python pandas dataframe

熊猫:0.23.4

根据documentation,我们得到DtypeWarning:如果数据包含intstr,则列(0)具有混合类型,建议设置low_memory = False,这删除警告。但是我的任务相反:定义具有混合类型的列!

起初,我想解析DtypeWarning消息,以便我可以理解哪些列具有混合类型,但是遇到很多困难,使我无法依赖DtypeWarning:

  1. 如果您将行数从300,000减少到250,000,则DtypeWarning将不再出现,但我至少需要100,000行。
  2. 即使对于300,000行,也不总是使用混合类型来确定列,例如,我修改了doc中的数据框:

来自文档:

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的随机性。

1 个答案:

答案 0 :(得分:0)

它应该同时适用于行和列。

  

low_memory:布尔值,默认为True

     

内部对文件进行分块处理,从而降低了内存使用量   解析时,但可能是混合类型推断。确保不混   类型要么设置为False,要么使用dtype参数指定类型。   请注意,无论如何,整个文件都会读入单个DataFrame中,   使用chunksize或iterator参数以块形式返回数据。   (仅对C解析器有效)

这是From github page

  

这是确定性的-始终根据所得出的内容推断类型   在数据中。也就是说,内部块大小不是固定数字   行,而不是字节,因此是否可以混合使用dtype警告   或没有感觉会有点随机。

我认为您不应该为这些消息而烦恼,因为这些错误消息是通用的。

OR

df2 = pd.read_csv('test.csv', engine='c', dtype={'FULL': 'str', 'COUNT': 'int'}, header=1)