【问题标题】:Pandas dataframe - Select rows where one column's values contains a string and another column's values starts with specific stringsPandas 数据框 - 选择其中一列的值包含字符串且另一列的值以特定字符串开头的行
【发布时间】:2018-07-17 05:36:23
【问题描述】:

我希望选择 state 包含单词 Traded 且 trading _book 不以字母 'E'、'L'、'N' 开头的行

Test_Data = [('originating_system_id', ['RBCL', 'RBCL', 'RBCL','RBCL']),
             ('rbc_security_type1', ['CORP', 'CORP','CORP','CORP']),
             ('state', ['Traded', 'Traded Away','Traded','Traded Away']),
             ('trading_book', ['LCAAAAA','NUBBBBB','EDFGSFG','PDFEFGR'])
             ]
dfTest_Data = pd.DataFrame.from_items(Test_Data)
display(dfTest_Data)

originating_system_id   rbc_security_type1     state        trading_book
        RBCL                   CORP            Traded          LCAAAAA
        RBCL                   CORP            Traded Away     NUBBBBB
        RBCL                   CORP            Traded          EDFGSFG
        RBCL                   CORP            Traded Away     PDFEFGR

期望的输出:

originating_system_id   rbc_security_type1     state        trading_book
        RBCL                   CORP            Traded Away     PDFEFGR

虽然这样可以解决问题:

prefixes = ['E','L','N']
df_Traded_Away_User = dfTest_Data[
                                    dfTest_Data[~dfTest_Data['trading_book'].str.startswith(tuple(prefixes))]  &
                                    (dfTest_Data['state'].str.contains('Traded')) 
                                ][['originating_system_id','rbc_security_type1','state','trading_book']]
display(df_Traded_Away_User)

但我得到了:

ValueError: Must pass DataFrame with boolean values only

【问题讨论】:

    标签: python database pandas


    【解决方案1】:

    我建议单独创建每个布尔掩码以获得更好的可读性代码,然后将它们链接到&

    prefixes = ['E','L','N']
    
    m1 = ~dfTest_Data['trading_book'].str.startswith(tuple(prefixes))
    m2 = dfTest_Data['state'].str.contains('Traded')
    
    cols = ['originating_system_id','rbc_security_type1','state','trading_book']
    df_Traded_Away_User = dfTest_Data.loc[m1 & m2, cols]
    print (df_Traded_Away_User)
      originating_system_id rbc_security_type1        state trading_book
    3                  RBCL               CORP  Traded Away      PDFEFGR
    

    【讨论】:

    • 工作。过滤行时最好使用 .loc?
    • @PeterLucas - 这取决于需要什么。如果要按所有列过滤,则df_Traded_Away_User = dfTest_Data[m1 & m2] 更好,但如果只想按某些列过滤,例如像cols = ['originating_system_id', 'trading_book']df_Traded_Away_User = dfTest_Data.loc[m1 & m2, cols]这样的2列是loc必要的。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2023-01-26
    • 2022-07-22
    • 2021-02-21
    • 2022-07-29
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多