我有一个带有升序组号的Dataframe或Numpy数组,我想分配一个每组重复的值列表(长度与唯一组数相等)。
ID - Group
0 - 0
1 - 0
2 - 1
3 - 1
4 - 1
5 - 2
6 - 2
7 - 3
要分配的值:
[4, 2, 7, 8] # 4 maps to group 0, 2 maps to group 1 etc
输出:
ID - Group - Val
0 - 0 - 4
1 - 0 - 4
2 - 1 - 2
3 - 1 - 2
4 - 1 - 2
5 - 2 - 7
6 - 2 - 7
7 - 3 - 8
赞赏任何建议,如果有解决问题的优雅方法/本机功能,则最好不要循环(寻找Numpy和Pandas解决方案)。
答案 0 :(得分:4)
设置 :
a = np.array([4, 2, 7, 8])
v = df.Group.values
dct = {}
选项1
使用numpy
索引。 (此解决方案假定您的组范围为0-N
:
dct['numpy_indexing'] = a[v]
选项2
使用np.repeat
。 (此解决方案假定您的组没有隔行扫描):
dct['numpy_repeat'] = np.repeat(a, np.bincount(v))
选项3
使用map
。这种方法将比其他方法慢一些,但更灵活一些,因为它允许隔行扫描组和非线性组:
d = dict(zip(np.unique(v), a))
dct['pandas_map'] = df.Group.map(d)
输出
df.assign(**dct)
ID Group numpy_indexing numpy_repeat pandas_map
0 0 0 4 4 4
1 1 0 4 4 4
2 2 1 2 2 2
3 3 1 2 2 2
4 4 1 2 2 2
5 5 2 7 7 7
6 6 2 7 7 7
7 7 3 8 8 8