Python 如果所有列都包含特定模式,请选择dataframe中的行

Python 如果所有列都包含特定模式,请选择dataframe中的行,python,string,pandas,dataframe,Python,String,Pandas,Dataframe,我有以下数据帧 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

我有以下数据帧

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作为索引,则从设置id开始

df = df.set_index('id')
检查每个字符串的一个选项是使用applymap调用str.endswith:

另一个选项是为每列应用调用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_和.reduce在列表理解中添加和屏蔽:

如果有其他列,但您只想考虑那些命名的模式*,则可以在数据文件上使用筛选器:

u = df.filter(like='pattern')
现在使用u重复上面的选项,例如,第一个选项将是

df[u.applymap(lambda x: x.endswith('--')).all(1)]

…依此类推。

如果尚未设置id作为索引,则从设置id开始

df = df.set_index('id')
检查每个字符串的一个选项是使用applymap调用str.endswith:

另一个选项是为每列应用调用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_和.reduce在列表理解中添加和屏蔽:

如果有其他列,但您只想考虑那些命名的模式*,则可以在数据文件上使用筛选器:

u = df.filter(like='pattern')
现在使用u重复上面的选项,例如,第一个选项将是

df[u.applymap(lambda x: x.endswith('--')).all(1)]

…等等。

我为什么建议在这里使用循环?如果你感兴趣,请阅读我在“为什么我会在这里建议循环”上的文章?如果你感兴趣,请阅读我在