如何按指定条件删除DataFrame中含0值的行?
如何按指定条件删除DataFrame中含0值的行?
我来帮你实现这个需求,咱们一步步来操作:
首先先还原你给出的示例DataFrame,用pandas创建:
import pandas as pd data = {'A': [1, 0, 0, 0, 2, 3], 'B': [2, 0, 0, 1, 0, 1]} df = pd.DataFrame(data)
接下来我们需要先标记出所有包含0的行(只要A或B列有0就算):
df['has_zero'] = (df['A'] == 0) | (df['B'] == 0)
然后要把连续的含0/不含0行分成不同的分组,这样才能统计每组的连续行数:
# 通过对比当前行与上一行的has_zero值,不同则分组序号加1 df['group'] = (df['has_zero'] != df['has_zero'].shift()).cumsum()
再计算每个分组的总行数,并把这个长度赋值给组内的每一行:
df['group_len'] = df.groupby('group')['has_zero'].transform('size')
现在就可以按照你的条件筛选要保留的行了:
- 不含0的行直接保留
- 含0的行仅保留连续行数在6到20之间的组(也就是排除1-5行连续含0、以及超过20行连续含0的组)
result_df = df[~df['has_zero'] | ((df['group_len'] > 5) & (df['group_len'] <= 20))].drop(columns=['has_zero', 'group', 'group_len'])
运行后得到的结果就是你期望的输出:
A B 0 1 2 5 3 1
简单解释下逻辑:中间那4行连续含0的行属于1-5行的范围,所以被删除;如果有一段25行连续的含0行,也会被删除;而如果是8行连续的含0行,就会被保留下来。
备注:内容来源于stack exchange,提问作者Cinecca
相关产品推荐
相关产品推荐

