【发布时间】:2016-05-06 09:56:03
【问题描述】:
我正在为数据清理操作而苦苦挣扎。我有一个包含 id、投资组合月份 (port_months) 和投资组合编号 (port) 的大型数据框,例如:
id port port_months backtest_month
49025 USA0EBZ0 0 1 1
80689 USA0EBZ0 0 2 2
224952 USA0EBZ0 0 3 4
... ... ... ...
227370 USA03BE0 1 1 12
229804 USA03BE0 1 2 13
232262 USA03BE0 1 3 14
... ... ... ...
很遗憾,我经常遇到新的id进入系统,数据不完整的情况,例如:
id port port_months backtest_month
63682 USA06W90 5 7 66
236452 USA06W90 5 8 67
238905 USA06W90 5 9 68
241358 USA06W90 5 10 69
243808 USA06W90 5 11 70
246229 USA06W90 5 12 71
这里的问题是这个id的数据进入了port_months = 7的数据框,而不是port_months = 1。我需要删除所有这些不完整的数据,因为另一个函数需要作用于只包含完整数据的数据集。所以,在这个例子中,我需要删除这个id,USA06W90,port = 5的数据(虽然你在这里看不到,但是port = 6的数据是完整的等等)。
我已经编写了一个简单的循环,它可以执行我想要的操作,但是速度非常慢,而且我确信我可以使用矢量化来做一些更复杂的事情:
for id in df.id:
for port in df.port.unique(): #so loop over ports where the current stock has some data, not those for which it is absent from the system
first_df = df[(df.id == id) & (df.port == port) & (df.port_months == 1)] #get the 1st row from the current port's dataframe
if first_df.empty:
df.drop(df[(df.id == id) & (df.port == port)].index, inplace = True) # drop all the rows associated with current id and port (i.e. all port_months for current port and id)
目前这需要 30 多分钟才能执行!
我一直在想一些巧妙的使用方法
groupby('id', port).apply(lambda x: x.port = x[x.port_months == 1].port)
或者什么,或者试图以某种方式使用一些技巧来构建新的投资组合并做ffill
port_new = df[df.port_months == 1].groupby('id', as_index = False).apply(lambda x: x.backtest_month / 12 )
重置索引,然后通过合并索引与df重新组合
这给出了:
id port port_months backtest_month
49025 USA0EBZ0 0 1 1
80689 USA0EBZ0 NaN 2 2
224952 USA0EBZ0 NaN 3 4
... ... ... ...
227370 USA03BE0 1 1 12
229804 USA03BE0 NaN 2 13
232262 USA03BE0 NaN 3 14
... ... ... ...
然后可以使用
填充 nansdf.fillna['port_new'](method = 'ffill')
这几乎可以工作,并且速度很快,但问题是您会遇到 id 进入然后再次离开数据集的情况,因此 ffill 也会填充所有这些 nas,而不是删除行,例如下面的 Nans 将被 5s 填充。
例如
id port port_months backtest_month
63682 USA06W90 5 11 70
236452 USA06W90 5 12 71
238905 USA06W90 NaN 1 121
241358 USA06W90 NaN 2 122
243808 USA06W90 NaN 3 123
246229 USA06W90 NaN 4 124
【问题讨论】:
标签: python loops pandas merge vectorization