You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中含NaN值的分类数据转索引的问题解决方法

解决分类数据转换中NaN的两个问题

嘿,我来帮你搞定这两个NaN的问题!核心原因是NaN在Python中不等于任何值,包括它自己,所以你用==去匹配NaN完全行不通,咱们来逐个解决:

问题1:NaN的占比计算错误

当value是NaN时,series == value会返回全False的序列,自然统计不到任何数量。解决办法是用pandas.isna()专门判断NaN:

for index, value in enumerate(series.unique()):
    if pd.isna(value):
        count = series.isna().sum()
    else:
        count = series[series == value].count()
    percentage = round(count / len(series) * 100, 2)
    print(index, value, percentage, '%')

这样就能正确统计NaN的出现次数和占比了。

问题2:NaN无法转换为索引

同样,series[series == value] = index对NaN完全不起作用,因为series == NaN永远是False。我们还是用isna()来定位NaN的位置:

for index, value in enumerate(series.unique()):
    if pd.isna(value):
        series[series.isna()] = index
    else:
        series[series == value] = index

这样NaN就会被正确赋值为对应的唯一索引。

完整修正后的代码

把上面的改动整合到函数里,最终代码如下:

import pandas as pd

def categorial(series: pd.Series) -> pd.Series:
    series = series.copy()

    # 修正问题1:正确计算包括NaN在内的占比
    for index, value in enumerate(series.unique()):
        if pd.isna(value):
            count = series.isna().sum()
        else:
            count = series[series == value].count()
        percentage = round(count / len(series) * 100, 2)
        print(index, value, percentage, '%')

    # 修正问题2:正确给NaN分配索引
    for index, value in enumerate(series.unique()):
        if pd.isna(value):
            series[series.isna()] = index
        else:
            series[series == value] = index

    return series.astype(pd.Int64Dtype())

# 测试示例数据
df = pd.DataFrame({'col1': ['male', 'female', pd.NA, 'female']})
result = categorial(df['col1'])
print("\n转换结果:")
print(result)

测试输出

运行这段代码后,你会看到:

0 male 25.0 %
1 female 50.0 %
2 <NA> 25.0 %

转换结果:
0    0
1    1
2    2
3    1
Name: col1, dtype: Int64

NaN不仅被正确统计了占比,还被分配了索引2,完美解决两个问题!

内容的提问来源于stack exchange,提问作者christophriepe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:25:16