在 pandas DataFrame 中保留 None (尽管有 astype() 和 to_parquet())
Retain None in pandas DataFrame (in spite of astype() and to_parquet())
如何强制 pandas DataFrame 保留 None
值,即使在使用 astype()
时也是如此?
详情
由于 pd.DataFrame
构造函数不提供复合 dtype
参数,我使用以下函数修复类型(to_parquet()
需要):
def _typed_dataframe(data: list) -> pd.DataFrame:
typing = {
'name': str,
'value': np.float64,
'info': str,
'scale': np.int8,
}
result = pd.DataFrame(data)
for label in result.keys():
result[label] = result[label].astype(typing[label])
return result
不幸的是,result[info] = result[info].astype(str)
将 info
中的所有 None
值转换为 "None"
字符串。我怎样才能禁止这样做,即保留 None
值?
更准确地说:data
中的 None
值在 result
DataFrame 中变为 np.nan
,由 astype(str)
变为 "nan"
, 当从 result
.
中提取时变为 "None"
根据@frosty 的评论,我们可以使用替代方法
typing = {
'name': str,
'value': np.float64,
'info': pd.StringDtype(),
'scale': np.int8,
}
但是,这需要 pandas ~= 1.0.0
。
作为更好的解决方案,您可以替换
for label in result.keys():
result[label] = result[label].astype(typing[label])
来自
result.astype(schema)
不幸的是,result.astype(typing)
没有效果,因为它无法处理复合类型。
如何强制 pandas DataFrame 保留 None
值,即使在使用 astype()
时也是如此?
详情
由于 pd.DataFrame
构造函数不提供复合 dtype
参数,我使用以下函数修复类型(to_parquet()
需要):
def _typed_dataframe(data: list) -> pd.DataFrame:
typing = {
'name': str,
'value': np.float64,
'info': str,
'scale': np.int8,
}
result = pd.DataFrame(data)
for label in result.keys():
result[label] = result[label].astype(typing[label])
return result
不幸的是,result[info] = result[info].astype(str)
将 info
中的所有 None
值转换为 "None"
字符串。我怎样才能禁止这样做,即保留 None
值?
更准确地说:data
中的 None
值在 result
DataFrame 中变为 np.nan
,由 astype(str)
变为 "nan"
, 当从 result
.
"None"
根据@frosty 的评论,我们可以使用替代方法
typing = {
'name': str,
'value': np.float64,
'info': pd.StringDtype(),
'scale': np.int8,
}
但是,这需要 pandas ~= 1.0.0
。
作为更好的解决方案,您可以替换
for label in result.keys():
result[label] = result[label].astype(typing[label])
来自
result.astype(schema)
不幸的是,result.astype(typing)
没有效果,因为它无法处理复合类型。