在Pandas数据框中的多个条件下删除行

时间:2018-09-22 12:57:59

标签: python pandas

我的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

有什么办法解决上述问题吗?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

尝试使用loc过滤df。它是如此强大。 “〜”表示您想要与您的状况相反。 “:”表示您希望保留所有列

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

mask = df['Product_Code'].isin(['filter1', 'filter2', 'filter3'])
df = df[~mask]
df.head()

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

在列式过滤器中添加~会颠倒isin()的逻辑。