我有以下函数应返回数据帧列表。这些数据框不得包含任何已包含的值。
idx是满足条件的索引列表(虚拟= 1)。 然后丢弃虚拟对象(n)周围的所有内容。
我的输出应该是一个数据帧列表,其中包含未丢弃的值,但没有其他值(介于2个虚拟变量之间)。第一个数据帧正常。我对元素进行计数,并使用for循环尝试收集其他切片,但是,这些切片不会返回所需范围内的数据帧。
data = pd.DataFrame(data={"A":[1,2,3,4,5,6,7,8,9,10],
"B":[1,3,3,4,5,6,7,8,9,10],
"event":[0,0,0,0,1,0,0,0,1,0]})
def EstimationWindow (data, n=3, dummy=1):
'''
data....data. Contains ALL data - reurns, and event dummies = event column
dummy...event=1
n.......days before/after
'''
idx = data.index.get_indexer_for(data[data.event==dummy].index)
# Drop event window
estwin = data.drop((np.unique(np.concatenate([np.arange(max(i-n,0), min(i+n+1, len(data))) for i in idx]))))
# estwin = [estwin.iloc[0:i-n] for i in idx]
output = [estwin.iloc[0:idx[0]-n]]
for i in idx[1:]:
out = pd.DataFrame(estwin.loc[len(output):i-n])
output.append(out)
return(output)
该函数应返回一个列表:output = [df1, df2]
想要:
[ A B event
0 1 1 0
1 2 3 0
2 3 3 0, A B event
6 7 7 0]
结果:
[ A B event
0 1 1 0
1 2 3 0
2 3 3 0, A B event
1 2 3 0
2 3 3 0
6 7 7 0]
答案 0 :(得分:1)
无需for
循环即可构建拆分的df
列表。找到假人,使用union
建立要删除的索引,而仅使用简单的groupby
:
s = df.event.eq(1)
dummies = s[s].index
ind_to_drop = (dummies + 1).union(dummies).union(dummies - 1)
c = df.event.cumsum().drop(ind_to_drop)
然后
for _, g in df.drop(ind_to_drop).groupby(c):
print(g)
收益
A B event
0 1 1 0
1 2 3 0
2 3 3 0
A B event
6 7 7 0