【问题标题】:Pandas - Reading in json, boolean is typed as float if it contains null valuePandas - 读取json,如果布尔值包含空值,则将其键入为浮点数
【发布时间】:2021-09-21 15:08:13
【问题描述】:

我在 S3 上有一个 JSON 文件,其中包含以下数据:

{"id": "1", "col1": null, "col2": "Test1", "col3": true}
{"id": "2", "col1": "abc", "col2": "Test2", "col3": null}
{"id": "3", "col1": "def", "col2": "Test3", "col3": true}

注意,col3 中有布尔值,但其中一行有一个空值。这是我的代码:

import pandas as pd
source_path = 's3://bucket/prefix/file.json'
df = pd.read_json(source_path, lines=True)
df.dtypes

输出:

id        int64
col1     object
col2     object
col3    float64
dtype: object

df:

    id  col1    col2    col3
0   1   None    Test1   1.0
1   2   abc     Test2   NaN
2   3   def     Test3   1.0

为什么 col3 被输入为浮点数?

Col1 有一个空值,但似乎正确地键入为一个对象(字符串)。是否有一种通用的方式(不明确地将“col3”转换为布尔值)来获取数据帧上的布尔类型?

【问题讨论】:

  • 布尔值只有真/假
  • 在你的情况下,熊猫列中只有一种类型是浮点数,因为 NaN 是浮点数
  • 它需要转换为可以为空的 dtype,因此是 float64。在最近的版本中,您可以转换为 nullabe 整数类型,例如“Int64”。
  • @jarretg - 你认为nullfalse 吗?如果答案是肯定的 - 下面的答案可能对您有用。
  • @balderman - 这是来自第 3 方的数据,所以我真的不能说。我想我有 2 个问题,“为什么这是浮点类型”,这似乎是因为 Pandas 不允许可以为空的布尔值,所以 null 强制它是浮点数。第二个问题,“有没有一种通用的方法让 Pandas 将该列中的空值作为布尔值读取”,我认为你的回答意味着这是不可能的。我正在寻找一种解决方案,我 不必 必须直接提供列名。

标签: python json pandas


【解决方案1】:

对于这种情况,似乎在 read_json 调用中添加“dtype=False”给了我想要的行为。

import pandas as pd
source_path = 's3://bucket/prefix/file.json'
df = pd.read_json(source_path, lines=True, dtype=False)
df.dtypes

输出:

id      object
col1    object
col2    object
col3    object
dtype: object

如果我随后将此数据帧作为镶木地板文件写入 S3,则输出文件将正确键入为布尔值。

【讨论】:

    【解决方案2】:

    假设 OP将null视为false,我们可以将col3None值替换为False

    import json
    
    data_str = '''{"id": "2", "col1": "abc", "col2": "Test2", "col3": null}'''
    data = json.loads(data_str)
    if not isinstance(data['col3'], bool):
        data['col3'] = False
    print(data)
    

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 2019-04-29
      • 2016-10-22
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多