我有一个数据框,其中有一个稀疏填充的列。大部分值都是空白的;唯一的其他值是“Buy”和“Sell”。如果最后一个非空值是“Buy”,则我想用“long”替换空白值;如果最后一个非空值是“Sell”,则我想用“short”替换空白值。我可以在循环中轻松地完成这个操作,但我想知道是否有一种非循环的方法来实现它?
我有一个数据框,其中有一个稀疏填充的列。大部分值都是空白的;唯一的其他值是“Buy”和“Sell”。如果最后一个非空值是“Buy”,则我想用“long”替换空白值;如果最后一个非空值是“Sell”,则我想用“short”替换空白值。我可以在循环中轻松地完成这个操作,但我想知道是否有一种非循环的方法来实现它?
fillna
或combine_first
来替换由助手df
创建的None
,使用replace
和ffill
(使用方法为fillna
和参数ffill
- 前向填充NaN
和None
)。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
replace
和ffill
创建的第二个df
来填充df.fillna
,所以它用第二个df
中的值替换了原始的Nones
。类似的工作方式是combine_first
。 - jezrael