我的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
有什么办法解决上述问题吗?
答案 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()
的逻辑。