删除含空值行后Pandas DataFrame剩余值频率上升,此现象是否异常?求原因
我写了一段Python代码来移除bestSpot列中出现频率极低的行,代码如下:
df = xl.parse("Tabelle1") #removing places for which frequency is very less freq = df['bestSpot'].value_counts() print(freq[:12]) to_remove = freq[freq<7].index df['bestSpot'].replace(to_remove,None,inplace = True) df = df.dropna() freq = df['bestSpot'].value_counts() print(freq[:12])
执行后得到的输出是:
Weissenstein 28 Fiesch 17 Fanas 15 Niesen 11 Brunni 8 Amisbühl 6 Balderen 4 Marbachegg 4 Cimetta 3 Lai Alv 3 Schwängimatt 2 Mornera 2 Name: bestSpot, dtype: int64 Weissenstein 33 Fiesch 28 Fanas 19 Niesen 13 Brunni 10 Name: bestSpot, dtype: int64
我发现代码确实移除了低频行,但剩余取值的频率也上升了,这是异常行为吗?能不能解释下原因?
这完全不是异常行为,大概率是你对统计结果的解读出现了偏差,我来帮你拆解清楚:
先确认你的代码逻辑是正常的
你的代码步骤没问题:
- 读取Excel表格数据
- 统计
bestSpot列所有类别的出现次数 - 标记出现次数<7的类别为待删除项
- 将这些低频类别的值替换为
None,再删除包含None的行 - 重新统计剩余数据的类别次数
为什么看起来次数上升了?
你看到的「次数增加」有几个可能的核心原因:
截断打印导致的误读
第一次你只打印了freq[:12](前12个高频类别),但原始数据里Weissenstein的真实出现次数可能就是33——只是在原始统计中,还有其他同类别变体(比如大小写不同、末尾带空格的Weissenstein)被单独统计,这些变体的次数没有出现在你打印的前12个里。当你删除低频行后,这些变体如果不属于待删除项,就会被保留,导致第二次统计时同个类别的总次数看起来变多了。数据中存在同类别不同形式的条目
比如你的bestSpot列里有Weissenstein和weissenstein(大小写差异)、Weissenstein(末尾带空格)这类条目,第一次value_counts()会把它们当作独立类别统计:- 标准写法
Weissenstein:28次 - 变体
weissenstein:5次(属于低频<7)
如果你的to_remove里没有包含这个变体(比如因为大小写不匹配导致freq统计时没把它和标准写法归为一类),那这些变体行不会被删除,第二次统计时你可能误以为是原类别次数上升了。
- 标准写法
统计总和的验证
你可以在代码里加两行打印总次数的代码,快速验证逻辑是否正常:# 第一次统计后打印总次数 print("原始总次数:", freq.sum()) # 删除后第二次统计打印总次数 print("删除后总次数:", freq.sum())如果删除后的总次数等于原始总次数减去低频类别的总次数(6+4+4+3+3+2+2=24),那说明代码完全正常,你看到的「次数上升」只是截断打印带来的误解。
另外,建议你打印完整的freq结果(而不是freq[:12]),看看原始数据里Weissenstein的真实次数到底是多少,这样就能直接确认是不是截断展示导致的问题。
总结:你的代码逻辑没有问题,这个现象不是异常,大概率是统计结果的展示或解读偏差造成的。
内容的提问来源于stack exchange,提问作者wings

