【发布时间】:2018-10-22 20:23:38
【问题描述】:
熊猫:0.23.4
根据documentation,如果数据包含int和str,我们会得到DtypeWarning: Columns (0) has mixed types,建议设置low_memory=False,这样可以消除警告。但我的任务是相反的:定义具有混合类型的列!
起初,我想解析 DtypeWarning 消息,以便了解哪些列具有混合类型,但遇到了很多困难,使我无法依赖 DtypeWarning:
- 如果将行数从 300,000 减少到 250,000,则不再出现 DtypeWarning,但我至少需要 100,000 行
- 即使对于 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) 并强制熊猫不要隐藏所有数据集或至少 100 000 行的混合类型?或者有什么想法?
谢谢。
总结
似乎pandas不允许知道哪些列具有混合类型,而是相反将混合类型隐藏在dtype后面object和str里面。 DtypeWarning 作为规则的一个例外。来自@pygo 答案的The link 解释了DtypeWarning 的随机性。
【问题讨论】:
-
我相信没有
read_csv(mixed_types=True。 -
试试
df2 = pd.read_csv('test.csv', engine='c', dtype={'FULL': 'str', 'COUNT': 'int'}, header=1)我已将其包含在我的答案中。 -
您不能有混合的列类型。不过,您可以使用 object dtype。
-
@pygo,我见过SO thread,它不能决定我的问题,因为pandas 在read_csv() 时将混合数据设为'str' - 整数和字符串都确定为'str'