如何用Pandas仅在energy>0且Date含.22/.23时删除DataFrame行
搞定DataFrame行删除的正确姿势
先明确你的核心要求:只删掉同时满足两个条件的行——energy值大于0,而且Date里包含.22或.23;所有energy=0的行,不管Date是什么,都必须保留。
为啥之前的代码会误删?
估计你之前写的代码把逻辑搞混了,比如错用了|(或)而非&(且),导致把energy>0或者Date符合条件的行全删了,连energy=0但Date带.22/.23的行也被误删。
正确代码两种写法
写法一:直接定义要保留的行
我们要留的行,要么是energy≤0,要么是Date里不含.22/.23,把这两个条件用|(或)连接即可:
# 先把Date转成字符串类型(如果原本不是的话) df['Date'] = df['Date'].astype(str) # 构建保留规则 keep_rows = (df['energy'] <= 0) | (~df['Date'].str.contains('\.22|\.23')) # 筛选出要保留的行 df = df[keep_rows]
写法二:先定位要删除的行再排除
先精准找到要删除的目标行(energy>0 且 Date含.22/.23),再取反保留其他行:
df['Date'] = df['Date'].astype(str) # 定位要删除的行 drop_rows = (df['energy'] > 0) & (df['Date'].str.contains('\.22|\.23')) # 排除这些行 df = df[~drop_rows]
关键注意事项
- 使用
str.contains时,.是正则表达式的特殊字符,必须用\转义成\.,否则会匹配任意字符(比如x22也会被误判为符合条件) - 如果你的
Date列不是字符串类型,一定要先转换,否则str.contains会报错
示例验证
假设原始数据:
| Date | energy |
|---|---|
| 2022.22 | 10 |
| 2023.23 | 0 |
| 2021.21 | 5 |
| 2022.22 | 0 |
运行上述代码后,只会删除第一行,其余三行全部保留,完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

