根据条件删除pandas数据帧中的行

时间:2017-07-21 15:33:29

标签: python pandas dataframe

场景:我有一个数据帧,周围有一些纳米分散。它有多个列,感兴趣的是" bid"和"问"

我想做什么:我想删除所有出价栏值为nan并且ask列值为nan的行。

问题:最好的方法是什么?

我已尝试过的内容:

ab_df = ab_df[ab_df.bid != 'nan' and ab_df.ask != 'nan']

ab_df = ab_df[ab_df.bid.empty and ab_df.ask.empty] 

ab_df = ab_df[ab_df.bid.notnull and ab_df.ask.notnull]

但它们都不起作用。

2 个答案:

答案 0 :(得分:3)

你需要向量化的逻辑运算符&|(来自python的来比较不是pandas系列的标量),检查nan值,您可以使用isnullnotnull

删除所有出价栏值为nan并且ask列值为nan 的行,请保持相反:

ab_df[ab_df.bid.notnull() | ab_df.ask.notnull()]

实施例

df = pd.DataFrame({
        "bid": [pd.np.nan, 1, 2, pd.np.nan],
        "ask": [pd.np.nan, pd.np.nan, 2, 1]
    })

df[df.bid.notnull() | df.ask.notnull()]

#   ask bid
#1  NaN 1.0
#2  2.0 2.0
#3  1.0 NaN

如果您需要两列都不丢失:

df[df.bid.notnull() & df.ask.notnull()]

#   ask bid
#2  2.0 2.0

通过设置 thresh 参数使用dropna的另一个选项:

df.dropna(subset=['ask', 'bid'], thresh=1)

#   ask bid
#1  NaN 1.0
#2  2.0 2.0
#3  1.0 NaN

df.dropna(subset=['ask', 'bid'], thresh=2)

#   ask bid
#2  2.0 2.0

答案 1 :(得分:2)

ab_df = ab_df.loc[~ab_df.bid.isnull() | ~ab_df.ask.isnull()]

这段时间我一直在说,因为我说服自己.notnull()不存在。 TIL。

ab_df = ab_df.loc[ab_df.bid.notnull() | ab_df.ask.notnull()]

密钥为&而不是and|,而不是or

我之前使用&犯了一个错误 - 这是错误的,因为您希望出价不为空或者询问是否为空,使用并且只会给出两个都不为空的行。

我认为你也可以ab_df.dropna(),但我必须要查找

编辑

奇怪df.dropna()似乎不支持基于特定列中的NA的丢弃。我原以为它确实如此。

根据我现在看到的其他答案。星期五下午好吗?