开发者社区> 问答> 正文

如果所有列都包含特定模式,请在pandas数据框中选择行 问

我有以下数据框

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列。如何过滤该行中所有列与特定模式/条件匹配的行?

展开
收起
一码平川MACHEL 2019-01-18 10:17:56 1483 0
1 条回答
写回答
取消 提交回答
  • 首先将“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 *”的列,则可以filter在DataFrame上使用:

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

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

    2019-07-17 23:25:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
中文:即学即用的Pandas入门与时间序列分析 立即下载
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载