【问题标题】:How can I use Pandas or Numpy to infer a datatype from a list of values?如何使用 Pandas 或 Numpy 从值列表中推断数据类型?
【发布时间】:2015-11-23 20:10:34
【问题描述】:

我有一个布尔值数组,目前归类为object 数组。如何让 Pandas/Numpy 重新运行类型推理引擎?

0     True
1    False
2     True
Name: b, dtype: object

我发现的唯一解决方案是将其显式转换为 Python 数组,然后再转换回 Pandas 数组:

ipdb> numpy.array(tmp)
array([True, False, True], dtype=object)
ipdb> numpy.array(list(tmp))
array([ True, False,  True], dtype=bool)

但这感觉很不理想。


关于为什么会发生这种情况的简要背景:

  • 正在从 CSV 文件(可能有数千个我无法控制的文件)加载数据。
  • 其中很多是由 Excel 生成的带有空白行的劣质表格。
  • 使用read_csv 读取它们,并删除空白行。
  • 但他们坚持使用错误的 dtype,因为最初该列包含空白字符串。
  • 我希望对数据进行尽可能严格的限制,因为它正在提交给后续的解析引擎。

【问题讨论】:

  • object 在这里是正确的dtypedocs.scipy.org/doc/numpy/reference/arrays.scalars.html 它们确实是布尔值,所以你不必担心
  • 我需要将它们提交到数据仓库并声明这是一个严格的布尔列。所以我确实需要获得比“对象”更紧密的界限——这必须是可能的,因为转换 pandas -> python -> pandas 会改变 dtype。
  • 我无法重现这个,当所有元素都是布尔值时,我得到 bool 作为 dtype
  • 也可以强制投dtypedf['b'].astype(bool)
  • 复制,执行:pandas.Series([True,False,True,None]).dropna()

标签: python arrays numpy pandas


【解决方案1】:

因为即使在调用dropna 之后,您最初也有一个混合的dtype,然后您可以强制 dtype,因为您感兴趣的只是保留数字和布尔类型,然后调用 convert_objectsto_numeric 将正确转换dtype:

In [31]:
pd.Series([True,False,True,None]).dropna().convert_objects(convert_numeric=True)

Out[31]:
0     True
1    False
2     True
dtype: bool

In [30]:    
pd.to_numeric(pd.Series([True,False,True,None]).dropna())

Out[30]:
0     True
1    False
2     True
dtype: bool

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2019-06-22
    • 2017-03-21
    • 2021-07-26
    相关资源
    最近更新 更多