根据索引拆分数据框

时间:2017-09-27 13:53:39

标签: python pandas dataframe indexing

我想根据索引拆分下面的DF_input。这来自下面的DF,如何获得:

       measurement      value
0              0        13
1              1         3
2              2         4
0              0         8
1              1        12
2              2        34 
3              5        54 

DF_output1

       measurement      value
0              0        13
1              1         3
2              2         4

DF_output2

       measurement      value
0              0         8
1              1        12
2              2        34 
3              5        54 

我做的是以下内容:`

            df_input.reset_index(inplace=True)         
            shifted = df_dataset['index'].shift()
            m = shifted.diff(-1).ne(0.000000)             
            a = m.cumsum()
            aa = df_dataset.groupby([df_dataset.uuid,a])                

            for k, gp in aa:
                print(gp)

我做错了什么?任何帮助请非常感谢。 最诚挚的问候,卡罗

5 个答案:

答案 0 :(得分:1)

您可以使用:

a = df.index.to_series().eq(0).cumsum()
print (a)
0    1
1    1
2    1
0    2
1    2
2    2
3    2
dtype: int32
aa = df.groupby(a)

for k, gp in aa:
    print(gp)

答案 1 :(得分:1)

使用groupby将索引划分为增加子序列的单独数据帧:

for _, g in df.groupby((df.index.to_series().diff().fillna(1) < 0).cumsum()):
     print(g, '\n')

   measurement  value
0            0     13
1            1      3
2            2      4 

   measurement  value
0            0      8
1            1     12
2            2     34
3            5     54 

这个解决方案稍微灵活一些,因为它没有根据它们是以0开头来定义组,而是在索引中找到增加的子序列。

答案 2 :(得分:1)

等索引上使用groupby
In [4266]: for n, g in df.groupby((df.index == 0).cumsum()):
      ...:     print g
      ...:
   measurement  value
0            0     13
1            1      3
2            2      4
   measurement  value
0            0      8
1            1     12
2            2     34
3            5     54

最好存储它有dict。

In [4264]: {n: g for n, g in df.groupby((df.index == 0).cumsum())}
Out[4264]:
{1:    measurement  value
 0            0     13
 1            1      3
 2            2      4, 2:    measurement  value
 0            0      8
 1            1     12
 2            2     34
 3            5     54}

分区方法的时间

In [4279]: df.shape
Out[4279]: (7000, 3)

In [4280]: %timeit (df.index == 0).cumsum()
1000 loops, best of 3: 118 µs per loop

In [4281]: %timeit df.index.to_series().eq(0).cumsum()
1000 loops, best of 3: 420 µs per loop

In [4282]: %timeit (df.index.to_series().diff().fillna(1) < 0).cumsum()
1000 loops, best of 3: 623 µs per loop

In [4284]: df.shape
Out[4284]: (70000, 4)

In [4285]: %timeit (df.index == 0).cumsum()
1000 loops, best of 3: 328 µs per loop

In [4286]: %timeit df.index.to_series().eq(0).cumsum()
1000 loops, best of 3: 805 µs per loop

In [4287]: %timeit (df.index.to_series().diff().fillna(1) < 0).cumsum()
100 loops, best of 3: 1.42 ms per loop

答案 3 :(得分:1)

这是我的答案:

        df_input.reset_index(inplace=True)         
        shifted = df_dataset['index'].shift()
        m = shifted.diff(-1).gt(0.000000)             
        a = m.cumsum()
        aa = df_dataset.groupby([df_dataset.uuid,a])                

        for k, gp in aa:
            print(gp)

答案 4 :(得分:1)

这是我的解决方案......(真的很难想出边框)

df=df.reset_index()
ll=df.loc[df.measurement==0,].index.values.tolist()

for i in range(len(ll)) :
    if i<len(ll)-1:
        print(df.loc[ll[i]:(ll[i+1]-1)])
    else :
        print(df.loc[ll[i]:])


   index  measurement  value
0      0            0     13
1      1            1      3
2      2            2      4
   index  measurement  value
3      0            0      8
4      1            1     12
5      2            2     34
6      3            5     54