场景:我有一个数据帧,周围有一些纳米分散。它有多个列,感兴趣的是" 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]
但它们都不起作用。
答案 0 :(得分:3)
你需要向量化的逻辑运算符&
或|
(来自python的和和或来比较不是pandas系列的标量),检查nan值,您可以使用isnull
和notnull
:
要删除所有出价栏值为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的丢弃。我原以为它确实如此。
根据我现在看到的其他答案。星期五下午好吗?