如何从基于条件expression式的pandas DataFrame中删除行

我有一个pandasDataFrame,我想从它删除特定列中的string长度大于2的行。我知道我可以使用df.dropna()来摆脱包含任何NaN的行,但我没有看到如何删除基于条件expression式的行。

这个问题的答案似乎非常接近我想要的 – 似乎我应该能够做到这样的事情:

 df[(len(df['column name']) < 2)] 

但我只是得到错误:

 KeyError: u'no item named False' 

谁能告诉我我做错了什么?

当你做len(df['column name'])你只是得到一个数字,即DataFrame中的行数(即列本身的长度)。 如果要将len应用于列中的每个元素,请使用df['column name'].map(len) 。 所以试试

 df[df['column name'].map(len) < 2] 

直接回答这个问题的标题(我理解不一定是OP的问题,但可以帮助其他用户遇到这个问题)一种方法是使用drop方法:

df = df.drop(some labels)

df = df.drop(df[<some boolean condition>].index)

要删除列'分数'<50的所有行:

df = df.drop(df[df.score < 50].index)

就地版本(正如在评论中指出的那样)

df.drop(df[df.score < 50].index, inplace=True)

多个条件

(请参见布尔索引 )

运营商是: |or ,为… and ,为…为not 。 这些必须使用括号进行分组。

删除列“分数”<50和> 20的所有行

df = df.drop(df[(df.score < 50) & (df.score > 20)].index)

我正在寻找一个解决scheme,我偶然发现了一个明显的方法,就是过滤dataframe,并返回到原来的dataframe

 df= df[df["score"] > 50]