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

