Начните с установки «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
:
# m = np.logical_and.reduce([df[c].str.endswith('--') for c in df.columns])
m = np.logical_and.reduce([
[x.endswith('--') for x in df[c]] for c in df.columns])
m
# array([False, True, True, False])
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)]
... и т. Д.