如何统计数据框每行各单元格字符数并删除所有列字符数均不足5的行?
如何统计数据框每行各单元格字符数并删除所有列字符数均不足5的行?
嘿,这个需求我太熟了!你说的新建一堆中间列确实挺麻烦的,其实用Pandas的链式操作就能简洁搞定,我给你一步步拆解清楚:
首先,核心思路是:先算出每个单元格的字符长度,然后判断每行是否至少有一列的长度≥5,留下满足这个条件的行就行。
核心代码实现
先拿你给的示例数据来演示,代码可以写成这样:
import pandas as pd # 构造你提供的示例数据 df = pd.DataFrame({ 'column_1': ['werhi', 'sgds', 'wqyuio', 'fhi', 'sadfhkj'], 'column_2': ['dsfhjk', 'fuo', 'dsklh', 'd', 'sdjfkhs'], 'column_3': ['dh', 'g', 'fhkjfj', 'fgho', 'yyisdk'] }) # 核心过滤逻辑,一行搞定 df_filtered = df[df.fillna('').applymap(len).ge(5).any(axis=1)]
运行后得到的df_filtered就完全符合你想要的结果啦!
逐段解释代码逻辑
我把核心代码拆解开给你讲,你就懂为什么这么写:
df.fillna(''):先把所有NaN替换成空字符串——因为如果直接对NaN计算长度会报错,换成空字符串后长度就是0,不影响后续判断。.applymap(len):对DataFrame里的每个单元格计算字符长度,得到一个和原表形状完全一样的数值表,每个位置存的是对应单元格的字符数。.ge(5):把每个长度和5做比较,大于等于5的返回True,小于5的返回False,得到一个布尔值表。.any(axis=1):按行来判断,只要该行里有一个True(也就是至少有一列的字符数≥5),就返回True;如果全是False(所有列都不足5个字符),就返回False。- 最后用这个布尔Series去索引原DataFrame,就自动过滤掉了所有列都不足5字符的行。
额外补充
如果你的数据里有非字符串类型的列(比如数字),可以先把所有列转成字符串再处理,只需要在前面加个astype(str):
df_filtered = df[df.astype(str).fillna('').applymap(len).ge(5).any(axis=1)]
是不是比新建一堆列清爽多了?完全不用额外的中间变量,逻辑也一目了然~
备注:内容来源于stack exchange,提问作者DrakeMurdoch
相关产品推荐
相关产品推荐

