Numpy和Pandas按Bin重复值

时间:2018-10-31 15:57:53

标签: python pandas numpy

我有一个带有升序组号的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解决方案)。

1 个答案:

答案 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