如何从基于条件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]