使用参数列表删除行pandas

时间:2016-06-03 08:39:11

标签: python list pandas dataframe

我想删除pandas DataFrame

中不在列表中的所有行

例如,请考虑此数据框:

data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'year': [2012, 2012, 2013, 2014, 2014], 
    'reports': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa         Cruz', 'Maricopa', 'Yuma'])
df

要按名称删除一行,这很容易:

df = df[df.name != 'Tina'] # to drop the row which include Tina in the name column

但如果我只想保留Jason和Molly这一行:

List=['Jason', 'Molly']
df = df[df.name not in List]

不起作用!

3 个答案:

答案 0 :(得分:5)

使用isin并将列表作为arg传递,并使用~反转条件:

In [58]:
names = ['Jason', 'Molly']
df[~df['name'].isin(names)]

Out[58]:
                    name  reports  year
Santa         Cruz  Tina       31  2013
Maricopa            Jake        2  2014
Yuma                 Amy        3  2014

答案 1 :(得分:2)

使用isin~反转布尔值掩码。我认为更好的是使用列表的其他名称List,例如lnames使用EdChum

List=['Jason', 'Molly']
df = df[~df.name.isin(List)]

l=['Jason', 'Molly']
df = df[~df.name.isin(l)]

print (df)
                    name  reports  year
Santa         Cruz  Tina       31  2013
Maricopa            Jake        2  2014
Yuma                 Amy        3  2014

说明:

您可以mask使用boolean~ print (df['name'].isin(l)) Cochice True Pima True Santa Cruz False Maricopa False Yuma False Name: name, dtype: bool print (~df['name'].isin(l)) Cochice False Pima False Santa Cruz True Maricopa True Yuma True Name: name, dtype: bool 反转{/ 1}}:

{{1}}

答案 2 :(得分:0)

isin很棒。使用query的另一种方式是

In [821]: List = ['Jason', 'Molly']

In [822]: df.query('name not in @List')
Out[822]:
                    name  reports  year
Santa         Cruz  Tina       31  2013
Maricopa            Jake        2  2014
Yuma                 Amy        3  2014