在pandas数据框中有条件地替换空值

3

我有一个数据框,其中有一个稀疏填充的列。大部分值都是空白的;唯一的其他值是“Buy”和“Sell”。如果最后一个非空值是“Buy”,则我想用“long”替换空白值;如果最后一个非空值是“Sell”,则我想用“short”替换空白值。我可以在循环中轻松地完成这个操作,但我想知道是否有一种非循环的方法来实现它?

1个回答

1
你可以使用fillnacombine_first来替换由助手df创建的None,使用replaceffill(使用方法为fillna和参数ffill - 前向填充NaNNone)。
np.random.seed(12)
df = pd.DataFrame({'A':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)),
                   'B':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)),
                   'C':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6))})

print (df)

      A     B     C
0   Buy  Sell  None
1  None  None   Buy
2  Sell  None   Buy
3  None  None   Buy
4   Buy   Buy  Sell
5  None  None  None
6  None  None  None
7   Buy  None  None
8  None  None  Sell
9   Buy   Buy  None

df = df.fillna(df.replace({'Sell':'short', 'Buy':'long'}).ffill())
#alternative solution
#df = df.combine_first(df.replace({'Sell':'short', 'Buy':'long'}).ffill())
print (df)
       A      B      C
0    Buy   Sell   None
1   long  short    Buy
2   Sell  short    Buy
3  short  short    Buy
4    Buy    Buy   Sell
5   long   long  short
6   long   long  short
7    Buy   long  short
8   long   long   Sell
9    Buy    Buy  short

解释:

print (df.replace({'Sell':'short', 'Buy':'long'}))
       A      B      C
0   long  short   None
1   None   None   long
2  short   None   long
3   None   None   long
4   long   long  short
5   None   None   None
6   None   None   None
7   long   None   None
8   None   None  short
9   long   long   None

print (df.replace({'Sell':'short', 'Buy':'long'}).ffill())
       A      B      C
0   long  short   None
1   long  short   long
2  short  short   long
3  short  short   long
4   long   long  short
5   long   long  short
6   long   long  short
7   long   long  short
8   long   long  short
9   long   long  short

谢谢。你的第一个回答块似乎正是我想要的,保留了买入和卖出,用longs和shorts替换了空白。然而,在你的解释(块2)中,结果完全由longs和shorts组成——原始的Buys和Sells已经消失了。看着你的代码,后者是我所期望的。然而,尝试你的代码后,我得到了前者——这正是我想要的。看起来我是用long替换了Buys,用short替换了Sells,然后进行了向前填充。但为什么原始的Buys和Sells被保留下来呢? - dborger
因为我使用了replaceffill创建的第二个df来填充df.fillna,所以它用第二个df中的值替换了原始的Nones。类似的工作方式是combine_first - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接