为了账号安全,请及时绑定邮箱和手机立即绑定

pandas如何删除某列符合正则表达式的数据所在行?

pandas如何删除某列符合正则表达式的数据所在行?

泛舟湖上清波郎朗 2019-02-06 09:09:02
现有数据两列,如下图:然后我想删除a列中符合某正则表达式(如0002开头)的数据。该如何写?添加:前面只是举例哈,因为不一定是XXXX开头,所以更希望是用re.正则表达式去匹配。谢谢楼下的回答。另:现在遇到另个小问题,就是可能不止匹配一种,所以需要做个循环,代码如下:        for shield in shields:             shield = shield.strip()             print("屏蔽规则:", shield)            data.loc[:, 'c'] = data['a'].map(lambda x: 1 if re.match(shield, x) else np.nan)            data = data[data['c'].isnull()]会报一个警告:C:ProgramDataAnaconda3libsite-packagespandascoreindexing.py:543: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: http://pandas.pydata.org/pand...self.obj[item] = s具体来说,就是最后一句的时候更改了原本的data,直接覆盖data,这样不太规范,但我确实是需要用新的data不断覆盖。怎么写更好呢?
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

fun = df['a'].apply(lambda x: x.startswith('0002'))
print df[fun == False]


查看完整回答
反对 回复 2019-02-19
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我猜a列是16进制数?

del_bool_list = df['a'].apply(lambda x : not str(x).startswith('0002'))df = df[del_bool_list]

我一开始被pd.drop() 这个方法误导了, 感觉删除就得用它, 后来一看一楼才明白, 直接覆盖掉也可以。
最后班门弄斧一下, pd.drop()最好有确定的索引再用, 否则, 会涉及存bool值的列表存索引值的列表转换的问题, 简单但不简洁


查看完整回答
反对 回复 2019-02-19
  • 2 回答
  • 0 关注
  • 2552 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信