【问题标题】:What if I need to get columns with mixed types?如果我需要获取混合类型的列怎么办?
【发布时间】:2018-10-22 20:23:38
【问题描述】:

熊猫:0.23.4

根据documentation,如果数据包含intstr,我们会得到DtypeWarning: Columns (0) has mixed types,建议设置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) 并强制熊猫不要隐藏所有数据集或至少 100 000 行的混合类型?或者有什么想法?

谢谢。

总结

似乎pandas不允许知道哪些列具有混合类型,而是相反将混合类型隐藏在dtype后面objectstr里面。 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'

标签: python pandas dataframe


【解决方案1】:

它应该适用于行和列。

low_memory : 布尔值,默认为 True

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

这是From github page

它是确定性的 - 类型始终根据什么来推断 在数据中。也就是说,内部块大小不是固定数字 行数,而不是字节数,所以是否可以混合 dtype 警告 或不可以感觉有点随机。

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

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

【讨论】:

  • 我的问题的本质是如何在不同的数据集上定义一个混合类型的列。我无法事先知道数据是什么,所以 dtype={'FULL': 'str', 'COUNT': 'int'} 不是一个选项。 DtypeWarning 是熊猫显示此类列的唯一方式(我还没有找到另一个),但并非总是如此(请参阅可重现的示例)
  • 谢谢,your link 解释了 DtypeWarning 的随机性。
  • @OleksandrZaitsev,很高兴它有帮助:-)
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2018-06-01
  • 2022-01-17
  • 2014-10-19
相关资源
最近更新 更多