【问题标题】:pandas: DTypeWarning, but I specified dtypespandas:DTypeWarning,但我指定了 dtypes
【发布时间】:2017-04-29 17:51:00
【问题描述】:

我正在使用以下内容读取 Pandas 数据框:

df = pd.read_csv('../table.csv.gz', nrows=10000,
                 index_col=False, engine='c',
                 true_values=[b'1'], false_values=[b'0'],
                 usecols=usecols, dtype=dtype)

我收到以下警告:

DtypeWarning: Columns (5,2397,2402,2449) have mixed types. Specify dtype option on import or set low_memory=False.

但列的标题名称存在于dtype 中。所有这些列的指定类型是np.bool,并且 csv 文件中这些列中存在的唯一值是 '1'''(逗号之间没有任何内容。这给出了一个类型为 object 的列,并且调用 DataFrame.fillna 时变为类型 bool)。

此外,当我编辑 CSV 文件以删除除违规列之外的所有列以尝试查明警告的来源时,警告停止发生。

发生了什么事?这是read_csv 中的错误吗?我应该忽略警告吗?

【问题讨论】:

  • 由于文件很大,很可能是分块读取和处理。它尝试将列存储为np.bool,但缺少的值迫使它将该块存储为object。 Pandas 使用np.nan 表示缺失值,因此在替换缺失值之前,该列必须为objectfloat。警告告诉您,由于分块读取,您可能在数据框中混合了 dtypes。您是否尝试为这些列的dtype 指定objectfloat

标签: python python-3.x csv pandas dataframe


【解决方案1】:

所以我猜你的问题是,当你读取文件时,这些列实际上有两种不同类型的值:np.bool('1') 和 np.nan(''),所以实际上如果你是告诉它将该列视为 np.bool 它不会这样做。我认为您可以尝试使用相同的方法,只需将 false_values 参数更改为 false_values = [b'']

df = pd.read_csv('../table.csv.gz', nrows=10000,
             index_col=False, engine='c',
             true_values=[b'1'], false_values=[b''],
             usecols=usecols, dtype=dtype)

如果这不起作用,您也可以这样做:

df.loc[:,[5,2397,2402,2449]].fillna('0',inplace = True)
df.to_csv('../table.csv.gz')

现在,当您回读它时,实际上应该是 0。

df = pd.read_csv('../table.csv.gz', nrows=10000,
             index_col=False, engine='c',
             true_values=[b'1'], false_values=[b'0'],
             usecols=usecols, dtype=dtype)

【讨论】:

  • 嗯,重新编辑文件以使其正常工作可能会很好。谢谢,我会这样做的。然而,很奇怪,正是这些列被提出来作为警告。我至少还有 20 个以上的布尔列具有空值。
猜你喜欢
  • 2016-12-24
  • 2021-08-21
  • 2018-09-18
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多