pandas - 获取每个多索引级别标签行的一小部分

时间:2014-09-15 16:34:17

标签: python pandas

我有一个XY问题。我的设置如下 - 我有一个多级索引为2级的数据帧。我想将它拆分为两个数据帧,只占第一级每个标签的一小部分行。例如:

df = pd.DataFrame({'a':[1, 1, 1, 1, 7, 7, 10, 10, 10, 10, 10, 10, 10], 'b': np.random.randint(0, 100, 13), 'c':np.random.randint(0, 100, 13)}).set_index(['a', 'b'])
df
Out[13]: 
        c
a  b     
1  86  83
   1   37
   57  64
   53   5
7  4   66
   13  49
10 61   0
   32  84
   97  59
   69  98
   25  52
   17  31
   37  95

因此,假设分数为0.5,我想将其拆分为两个数据帧:

        c
a  b     
1  86  83
   1   37
7  4   66
10 61   0
   32  84
   97  59
   69  98

        c
a  b     
1  57  64
   53   5
7  13  49
10 25  52
   17  31
   37  95

我考虑过(df.groupby(level = 0).count() * 0.5).astype(int)来限制“切片”数据帧。然后,如果我有办法添加如下的运行距离:

        c  r
a  b        
1  38  36  0
   6   47  1
   57   6  2
   55  45  3
7  7   51  0
   90  96  1
10 59  75  0
   27  16  1
   58   7  2
   79  51  3
   58  77  4
   63  48  5
   87  60  6

我可以加入限制和此df并使用布尔条件进行过滤。对这两个问题的任何建议? (拆分一小部分行或添加一个水平感知的运行索引)

1 个答案:

答案 0 :(得分:1)

对于groupby来说,事实证明这是微不足道的:

In [36]: df.groupby(level=0).apply(lambda x:x.head(int(x.shape[0] * 0.5))).reset_index(level=0, drop=True)
Out[36]: 
        c
a  b     
1  86  83
   1   37
7  4   66
10 61   0
   32  84
   97  59

同时获取每组的运行索引:

In [33]: df.groupby(level=0).cumcount()
Out[33]: 
a   b 
1   38    0
    6     1
    57    2
    55    3
7   7     0
    90    1
10  59    0
    27    1
    58    2
    79    3
    58    4
    63    5
    87    6
相关问题