我有以下数据框
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)]
这行不通。另外,我不能写下所有列的名称,因为共有 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([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*”的列,则可以在 DataFrame 上使用 filter
:
u = df.filter(like='pattern')
现在使用 u
重复上面的选项,例如,第一个选项将是
df[u.applymap(lambda x: x.endswith('--')).all(1)]
...等等。
关于python - 如果所有列都包含特定模式,请选择 Pandas 数据框中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54209868/