Pandas json_normalize 当其中一个值是 NaN 时,将 int 值的列转换为 float

Pandas json_normalize converts column of int values to float whan one of values is NaN

我注意到一个我不太理解的行为。

我正在将数据类项列表转换为数据框。 当所有值都不是-None 时,一切都按预期工作:

from dataclasses import dataclass
from dataclasses import asdict
from pandas import json_normalize

@dataclass
class TestItem:
    name: str = None
    id: int = None


test_item_list = [
    TestItem(name='teapot', id=11),
    TestItem(name='kettle', id=12),
    TestItem(name='boiler', id=13)
]

df = json_normalize(asdict(item) for item in test_item_list)
print(df)

结果就是这样。这是按预期工作的:

     name  id
0  teapot  11
1  kettle  12
2  boiler  13

但如果我们像这样更改 test_item_list

test_item_list = [
    TestItem(name='teapot', id=11),
    TestItem(name='kettle', id=12),
    TestItem(name='boiler')
]

输出将 'id' 列作为浮点值而不是 int:

     name    id
0  teapot  11.0
1  kettle  12.0
2  boiler   NaN

df.dtypes 还会显示 id 现在是 float64 列:

name     object
id      float64
dtype: object

如何解决这个问题?在实际工作示例中,我有几个更复杂的项目 类,无法手动将它们中的每一个显式转换为所需的列类型。

您可以将 id 列转换为 nullable integer data type

>>> df['id'] = df['id'].astype('Int64') # note the capital "I"

>>> print(df.dtypes)
name    object
id       Int64
dtype: object

输出:

     name    id
0  teapot    11
1  kettle    12
2  boiler  <NA>