我有以下数据框
id pattern1 pattern2 pattern3
1 a-b-c a-b-- a-b-c
2 a-a-- a-b-- a-c--
3 a-v-- a-m-- a-k--
4 a-b-- a-n-- a-n-c
我想过滤包含模式的行 - 在所有列的末尾。在这种情况下,输出将是
2 a-a-- a-b-- a-c--
3 a-v-- a-m-- a-k--
到目前为止,我只能想到做类似以下的事情
df[(len(df['pattern1'].str.split('--')[1])==0) & \
(len(df['pattern2'].str.split('--')[1])==0) & \
(len(df['pattern3'].str.split('--')[1])==0)]
这不起作用。另外,我不能写所有列的名称,因为tehre是20列。如何过滤该行中所有列与特定模式/条件匹配的行?
首先将“id”设置为索引(如果尚未完成)。
df = df.set_index('id')
检查每个字符串的一个选项是使用applymap调用str.endswith:
df[df.applymap(lambda x: x.endswith('--')).all(1)]
pattern1 pattern2 pattern3
id
2 a-a-- a-b-- a-c--
3 a-v-- a-m-- a-k--
另一个选择是apply调用pd.Series.str.endswith每一列:
df[df.apply(lambda x: x.str.endswith('--')).all(1)]
pattern1 pattern2 pattern3
id
2 a-a-- a-b-- a-c--
3 a-v-- a-m-- a-k--
最后,为了提高性能,您可以使用logical_and.reduce以下方法在列表理解中进行AND掩码:
m = np.logical_and.reduce([
[x.endswith('--') for x in df[c]] for c in df.columns])
m
df[m]
pattern1 pattern2 pattern3
id
2 a-a-- a-b-- a-c--
3 a-v-- a-m-- a-k--
如果还有其他列,但您只想考虑那些名为“pattern *”的列,则可以filter在DataFrame上使用:
u = df.filter(like='pattern')
现在重复使用上面的选项u,例如,第一个选项将是
df[u.applymap(lambda x: x.endswith('--')).all(1)]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。