我有两个熊猫数据框,我需要加入合并。
nd = cu.groupby('division')['usage'].nsmallest(5).rename('t_usage').reset_index()
nd = nd.merge(cu, left_on='level_1', right_index = True)
nd.shape
我基本上已经在每个部门中使用了前5个元素但是当我将其合并到我的主数据帧时,我得到了很多额外的行。我是内部加入level_1,这是新数据框中“旧索引”的旧索引。
预期行数:92,合并后的实际行数:737。
感谢您的帮助!
答案 0 :(得分:1)
我认为您的代码应该通过apply
和nsmallest
进行简化:
np.random.seed(1997)
cu = pd.DataFrame({'division':np.random.choice(list('abcdef'), size=30),
'usage':np.random.randint(100, size=30),
'cols':np.random.randint(10, size=30)})
print (cu)
cols division usage
0 5 f 0
1 0 b 22
2 2 a 73
3 6 a 38
4 5 c 82
5 9 b 39
6 5 a 9
7 2 a 81
8 9 b 27
9 5 b 27
10 7 e 90
11 1 d 13
12 1 f 33
13 4 b 21
14 9 a 27
15 6 f 89
16 5 a 20
17 3 c 98
18 6 b 74
19 9 a 82
20 3 f 52
21 8 c 79
22 6 f 17
23 0 d 91
24 9 d 73
25 8 e 33
26 9 d 1
27 1 f 52
28 7 d 40
29 3 f 16
nd = cu.groupby('division', group_keys=False).apply(lambda x: x.nsmallest(5, 'usage'))
print (nd)
cols division usage
6 5 a 9
16 5 a 20
14 9 a 27
3 6 a 38
2 2 a 73
13 4 b 21
1 0 b 22
8 9 b 27
9 5 b 27
5 9 b 39
21 8 c 79
4 5 c 82
17 3 c 98
26 9 d 1
11 1 d 13
28 7 d 40
24 9 d 73
23 0 d 91
25 8 e 33
10 7 e 90
0 5 f 0
29 3 f 16
22 6 f 17
12 1 f 33
20 3 f 52