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

如何让pandas.Series.str.get_dummies()统计NaN值?需sep参数无法用get_dummies

解决多值字段拆分+NaN频次统计的问题

首先先解释你疑惑的.str部分:它是pandas为字符串类型的Series专门提供的访问器,用来调用各种字符串处理方法。因为普通的Series方法是针对整个序列的,而.str会帮你把操作应用到序列里的每一个字符串元素上——比如str.get_dummies()就是把每个元素按指定分隔符拆分,然后生成哑变量列,非常适合处理你的多值字段场景。

接下来解决你核心的痛点:既要拆分多值,又要统计NaN的频次。这里给你两种实用的方案:

方案一:临时标记NaN后拆分统计

这种方法先把NaN替换成一个临时标识,用str.get_dummies()拆分后再把标识改回NaN,完美兼容你原来的使用习惯:

import pandas as pd

# 读取测试数据
data = pd.read_csv("testdata.csv", sep=";")
series_a = data["a"]

# 1. 把NaN替换成临时标识(避免被str方法忽略)
series_with_na = series_a.fillna('__TEMP_NA__')

# 2. 拆分多值并统计各值的出现次数
dummies = series_with_na.str.get_dummies(sep=",")
counts = dummies.sum()

# 3. 把临时标识改回真正的NaN
counts = counts.rename(index={'__TEMP_NA__': pd.NA})

print(counts)

运行后会得到你想要的输出:

T      1
Tes    2
Test   1
<NA>   1
dtype: int64

方案二:展开列表后统计频次(更直观)

这种方法先把每个元素转成列表(NaN单独转成只包含NaN的列表),再用explode()把列表展开成单行元素,最后用value_counts(dropna=False)统计所有值的频次,包括NaN:

import pandas as pd

data = pd.read_csv("testdata.csv", sep=";")
series_a = data["a"]

# 处理每个元素:NaN转成[pd.NA],多值字符串拆分成列表
split_list = series_a.apply(lambda x: [pd.NA] if pd.isna(x) else str(x).split(","))

# 把列表展开成单个元素的序列
expanded_series = split_list.explode()

# 统计所有值的频次(包括NaN)
counts = expanded_series.value_counts(dropna=False)

print(counts)

这个方案的输出同样符合你的期望,而且逻辑更直白,适合需要灵活处理拆分后数据的场景。

两种方案都能解决你的问题,你可以根据自己的代码习惯选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:23:52