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
相关产品推荐
相关产品推荐

