【问题标题】:Drop rows on multiple conditions in pandas dataframe在熊猫数据框中删除多个条件的行
【发布时间】:2019-02-26 15:21:05
【问题描述】:

我的 df 有 3 列

df = pd.DataFrame({"col_1": (0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0), 
                   "col_2": (0.0, 0.24, 1.0, 0.0, 0.22, 3.11, 0.0),
                    "col_3": ("Mon", "Tue", "Thu", "Fri", "Mon", "Tue", "Thu")}) 

我想删除 df.col_1 为 1.0 且 df.col_2 为 0.0 的行。所以,我会得到:

df = pd.DataFrame({"col_1": (0.0, 0.0, 1.0, 0.0, 1.0), 
                   "col_2": (0.0, 0.24, 1.0, 0.22, 3.11),
                    "col_3": ("Mon", "Tue", "Thu", "Mon", "Tue")})

我试过了:

df_new = df.drop[df[(df['col_1'] == 1.0) & (df['col_2'] == 0.0)].index]

它给了我错误:

'method' object is not subscriptable

知道如何解决上述问题吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    drop 是一个方法,你使用[] 调用它,这就是它给你的原因:

    'method' object is not subscriptable
    

    更改为()(一个正常的方法调用)它应该可以工作:

    import pandas as pd
    
    df = pd.DataFrame({"col_1": (0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0),
                       "col_2": (0.0, 0.24, 1.0, 0.0, 0.22, 3.11, 0.0),
                       "col_3": ("Mon", "Tue", "Thu", "Fri", "Mon", "Tue", "Thu")})
    
    df_new = df.drop(df[(df['col_1'] == 1.0) & (df['col_2'] == 0.0)].index)
    print(df_new)
    

    输出

       col_1  col_2 col_3
    0    0.0   0.00   Mon
    1    0.0   0.24   Tue
    2    1.0   1.00   Thu
    4    0.0   0.22   Mon
    5    1.0   3.11   Tue
    

    【讨论】:

      【解决方案2】:

      尝试使用 loc 过滤您的 df。太强大了 “~”表示您想要与您的条件相反的情况。 “:”表示您要保留所有列

      df = df.loc[~((df['col_1'] == 1.0) & (df['col_2'] == 0.0)),:]
      

      【讨论】:

        【解决方案3】:

        您可以为此使用或 (|) 运算符, 请参阅此链接pandas: multiple conditions while indexing data frame - unexpected behavior

        即删除同时满足两个条件的行

         df = df.loc[~((df['col_1']==1) | (df['col_2']==0))]
        

        【讨论】:

        • “|”运算符用于“OR”,而“&”运算符用于“AND”条件。我认为这里需要的是 & 运算符
        【解决方案4】:
        mask = df['Product_Code'].isin(['filter1', 'filter2', 'filter3'])
        df = df[~mask]
        df.head()
        

        .isin() 允许您根据系列中的多个值过滤整个数据框。与我所知道的其他解决方案相比,这是要编写的最少代码量。

        在按列过滤器中添加~ 会反转isin() 的逻辑。

        【讨论】:

          【解决方案5】:

          将要删除的行的位置放在“位置”。

          df = df.drop(['location' axix=1, inplace=True]
          

          【讨论】:

            猜你喜欢
            • 2020-01-11
            • 1970-01-01
            • 2017-10-04
            • 1970-01-01
            • 2018-01-02
            • 1970-01-01
            • 2017-11-16
            • 2020-10-14
            • 2020-12-28
            相关资源
            最近更新 更多