【问题标题】:Select rows in pandas dataframe if all the columns contain certain pattern如果所有列都包含特定模式,则选择 pandas 数据框中的行
【发布时间】:2019-01-17 13:00:29
【问题描述】:

我有以下数据框

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

【问题讨论】:

    标签: python string pandas dataframe


    【解决方案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*”的列,则可以在 DataFrame 上使用filter

    u = df.filter(like='pattern')
    

    现在使用u重复上述选项,例如,第一个选项将是

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

    ...等等。

    【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2020-11-15
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多