我有一个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并使用布尔条件进行过滤。对这两个问题的任何建议? (拆分一小部分行或添加一个水平感知的运行索引)
答案 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