带有熊猫read_json的列dtype

里卡多·布科(Riccardo Bucco)

我有一个看起来像这样的json文件:

[{"A": 0, "B": "x"}, {"A": 1, "B": "y", "C": 0}, {"A": 2, "B": "z", "C": 1}]

由于“ C”列包含NaN值(第一行),因此熊猫自动推断其dtype为“ float64”:

>>> pd.read_json(path).C.dtype
dtype('float64')

但是,我希望“ C”列的dtype为“ Int32”。pd.read_json(path, dtype={"C": "Int32"})不起作用:

>>> pd.read_json(path, dtype={"C": "Int32"}).C.dtype
dtype('float64')

相反,pd.read_json(path).astype({"C": "Int32"})它可以工作:

>>> pd.read_json(path).astype({"C": "Int32"}).C.dtype
Int32Dtype()

为什么会这样?如何仅通过使用pd.read_json函数来设置正确的dtype

斯蒂夫

原因是在此代码部分中

        dtype = (
            self.dtype.get(name) if isinstance(self.dtype, dict) else self.dtype
        )
        if dtype is not None:
            try:
                dtype = np.dtype(dtype)
                return data.astype(dtype), True
            except (TypeError, ValueError):
                return data, False

尝试将整个列(数组)转换为该类型时,它将转换'Int32'numpy.int32,从而导致值错误(无法将非有限值(NA或inf)转换为整数)。因此,原始(未转换的)数据将在异常块中返回。
我猜这是熊猫中的某种错误,至少该行为没有正确记录。

astype另一方面,它的工作方式有所不同:它在系列中逐个应用'astype'),因此可以创建混合类型的列。

有趣的是,当直接指定扩展类型 pd.Int32Dtype()(而不是其字符串别名'Int32')时,乍一看就可以得到所需的结果,但是如果您查看这些类型,它们仍然是浮动的:

df = pd.read_json(json, dtype={"C": pd.Int32Dtype})
print(df)
#   A  B    C
#0  0  x  NaN
#1  1  y    0
#2  2  z    1
print(df.C.map(type))
#0    <class 'float'>
#1    <class 'float'>
#2    <class 'float'>
#Name: C, dtype: object

为了比较:

print(df.C.astype('Int32').map(type))
#0    <class 'pandas._libs.missing.NAType'>
#1                            <class 'int'>
#2                            <class 'int'>
#Name: C, dtype: object

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有日期时间索引的熊猫 to_json 和 read_json

从带有熊猫的日期时间列中选择行

将带有列表的字典的数据框列转换为带有熊猫的单独列

带有熊猫的DataFrames的DataFrame

根据带有熊猫的其他列在列中添加随机值

使用groupby的一列创建带有熊猫的X个新列

如何创建一个新列,其中包含Nan带有熊猫的列的名称?

交叉引用带有熊猫字符串列表的多列的有效方法

在Python中将具有多列文件的文件导入为带有熊猫的变量

每组的唯一值计数为带有熊猫的新列

在Python中基于带有熊猫的索引在新列中添加值

当列包含带有熊猫的值列表时,对值进行分组和计数

在带有熊猫的数据帧末尾附加 1 系列(列)

如何在read_json上定义dtype?

具有int64值的熊猫read_json引发ValueError:值太大

从带有熊猫的CSV读取小数表示形式

为每个带有熊猫的组创建组合的DataFrame

带有熊猫数据框绘图功能的颜色图

带有熊猫数据框的 ARIMA 模型

找到带有熊猫的列子集的最大差异

使用带有熊猫的数据框进行概率测试

选择带有熊猫的分组数据框的特定组

带有熊猫的pivot_table的多个级别

带有熊猫的DataFrame中的每小时数据

带有熊猫的数据集的平滑度

如何基于带有熊猫的索引列表将字符串的数据帧分为多列?

从带有熊猫的列中提取值时,无法仅检索遇到的第一个值

如何摆脱某些列并将其写到另一个带有熊猫的文件中?

跟踪数据框中的文件并将位置放在带有熊猫的另一列中