数据框列表:将数据框切成数据框列表

时间:2019-01-20 14:25:30

标签: python pandas

我有以下函数应返回数据帧列表。这些数据框不得包含任何已包含的值。

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]

1 个答案:

答案 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