我刚刚在SO上回答了另一个问题,并遇到了使用pd.drop
过滤数据帧的问题。这是我给出的例子:
import pandas as pd
import langdetect
df = pd.DataFrame({'Sentence':['es muy bueno','run, Forest! Run!','Ήξερα ότι θα εξετάζατε τον Μεταφραστή Google', 'This is Certainly en']})
df['Language'] = df['Sentence'].apply(lambda x: langdetect.detect(x))
# output
Sentence Language
0 es muy bueno es
1 run, Forest! Run! ro
2 Ήξερα ότι θα εξετάζατε τον Μεταφραστή Google el
3 This is Certainly en en
现在我想删除语言不是en
的所有行。使用df.drop(df['Language'] != 'en')
时意外返回:
Sentence Language
2 Ήξερα ότι θα εξετάζατε τον Μεταφραστή Google el
3 This is Certainly en en
但是,当我接受布尔索引时,它返回:
df['Language'] != 'en'
# output
0 True
1 True
2 True
3 False
Name: Language, dtype: bool
现在,我可以使用df.loc[df['Language'] == 'en']
解决这个问题。但我想知道为什么drop
表现得这样或者我做错了什么?
答案 0 :(得分:2)
drop
需要index
或column
标签
df.drop(df.index[(df['Language'] != 'en')])
Out[303]:
Sentence Language
3 ThisisCertainlyen en
答案 1 :(得分:2)
Pandas drop获取索引或列标签
labels : single label or list-like
Index or column labels to drop.
当您将以下内容传递给默认轴(即0)上的df.drop时,其丢弃的行0和1 - 对应于False(0)和True(1)
df['Language'] != 'en'
0 True
1 True
2 True
3 False
虽然可以像@ Wen的回答那样使用df.drop来完成,但最常用的方法是选择布尔索引或df.query