我想删除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]
不起作用!
答案 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
,例如l
或names
使用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