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

Dsh*_*h M 7 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")}) 
Run Code Online (Sandbox Code Playgroud)

我想删除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")})
Run Code Online (Sandbox Code Playgroud)

我试过了:

df_new = df.drop[df[(df['col_1'] == 1.0) & (df['col_2'] == 0.0)].index]
Run Code Online (Sandbox Code Playgroud)

它给了我错误:

'method' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决上述问题?

Cha*_*s R 10

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

df = df.loc[~((df['col_1'] == 1.0) & (df['col_2'] == 0.0)),:]
Run Code Online (Sandbox Code Playgroud)


小智 9

mask = df['Product_Code'].isin(['filter1', 'filter2', 'filter3'])
df = df[~mask]
df.head()
Run Code Online (Sandbox Code Playgroud)

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

添加~按列过滤器内部会颠倒 的逻辑isin()


Sau*_*abh 6

您可以为此使用或 (|) 运算符,请参阅此链接熊猫:索引数据框时的多个条件 - 意外行为

即删除满足两个条件的行

 df = df.loc[~((df['col_1']==1) | (df['col_2']==0))]
Run Code Online (Sandbox Code Playgroud)


Dan*_*ejo 5

drop是一种方法,您正在使用调用它[],这就是为什么它为您提供了:

'method' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

输出量

   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
Run Code Online (Sandbox Code Playgroud)