现有数据两列,如下图:然后我想删除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贡献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值的列表向存索引值的列表转换的问题, 简单但不简洁
添加回答
举报
0/150
提交
取消