考虑以下熊猫数据框:
import pandas as pd
change = [0.475, 0.625, 0.1, 0.2, -0.1, -0.75, 0.1, -0.1, 0.2, -0.2]
position = [1.0, 1.0, nan, nan, nan, -1.0, nan, nan, nan, nan]
date = ['20150101', '20150102', '20150103', '20150104', '20150105', '20150106', '20150107', '20150108', '20150109', '20150110']
pd.DataFrame({'date': date, 'position': position, 'change': change})
产出
date change position
20150101 0.475 1
20150102 0.625 1
20150103 0.1 np.nan
20150104 0.2 np.nan
20150105 -0.1 np.nan
20150106 -0.75 -1
20150107 0.1 np.nan
20150108 -0.1 np.nan
20150109 0.2 np.nan
20150110 -0.2 np.nan
我想用以下规则来填补:
对于“位置”值为np.nan的行,如果“更改”的值与位置的最后一个非空值具有相同的符号(更改*位置> 0,例如0.1 * 1和0.2 * 1> 0),我们用最后一个非空值填充。
对于“位置”值为np.nan的行,如果“更改”的值与位置的最后一个非空值具有相同的符号(更改*位置<= 0,例如-1 * 0.1),则用0填充。
一旦一个np.nan用0填充,接下来的np.nan也将用0填充。
以下是来自示例数据框的预期结果:
date change position
20150101 0.475 1
20150102 0.625 1
20150103 0.1 1
20150104 0.2 1
20150105 -0.1 0
20150106 -0.75 -1
20150107 0.1 0
20150108 -0.1 0
20150109 0.2 0
20150110 -0.2 0
编辑:
我开发的方法如下:
while(any(np.isnan(x['position']))):
conditions = [(np.isnan(x['position'])) & (x['position'].shift(1) * x['change'] > 0),
(np.isnan(x['position'])) & (x['position'].shift(1) * x['change'] <= 0)]
choices = [x['position'].shift(1), 0]
x['position'] = np.select(conditions, choices, default=x['position'])
但是如您所见,如果您有80,000,000行数据,它的效果不是很好,而且非常慢。
有什么建议?谢谢您的帮助!
我认为您的代码相当扎实,主要问题是您遍历它的次数比您需要的多。shift()
一次只返回一行,但是如果将其更改为,fillna(method='ffill')
则基本上可以获得无限制的移位次数,但只需执行一次即可,而不必进行多次迭代(多少迭代取决于您的数据)。
conditions = [
(np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']>0),
(np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']<=0)]
但我相信您可以进一步,并在最后while
添加另一步,从而消除这种情况fillna
:
conditions = [
(np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']>0),
(np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']<=0)]
choices=[x['position'].shift(1),0]
x['position'] = np.select(conditions,choices,default=x['position'])
x['position'] = x['position'].fillna(method='ffill')
在示例数据上,第一个更改比代码快约2倍,第二个更改约4倍。我得到的答案与您相同,但您当然需要在真实数据上进行验证,以确保确定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句