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>
我注意到一个我不太理解的行为。
我正在将数据类项列表转换为数据框。 当所有值都不是-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>