繁体   English   中英

Pandas - 为每行分配直方图桶

[英]Pandas - assign histogram bucket to each row

这是我的数据帧:

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 4, 6, 4, 3, 2, 7]})
buckets = [(0,3),(3,5),(5,9)]

我也有上面描述的直方图桶。 现在我想将每行数据帧分配给存储桶索引。 所以我想获得包含以下信息的新专栏:

df['buckets_index']  = [0,0,0,1,2,1,0,0,2]

当然,我可以用循环来做,但我有相当大的数据帧(2.5密耳行),所以我需要快速完成它。

有什么想法吗?

如果只需要索引,可以使用pd.cutlabels=False

buckets = [0,3,5,9]
df['bucket'] = pd.cut(df['A'], bins=buckets)
df['bucket_idx'] = pd.cut(df['A'], bins=buckets, labels=False)

结果输出:

   A  bucket  bucket_idx
0  1  (0, 3]           0
1  2  (0, 3]           0
2  3  (0, 3]           0
3  4  (3, 5]           1
4  6  (5, 9]           2
5  4  (3, 5]           1
6  3  (0, 3]           0
7  2  (0, 3]           0
8  7  (5, 9]           2

你可以使用np.searchsorted -

df['buckets_index'] = np.asarray(buckets)[:,1].searchsorted(df.A.values)

运行时测试 -

In [522]: df = pd.DataFrame({'A': np.random.randint(1,8,(10000))})

In [523]: buckets = [0,3,5,9]

In [524]: %timeit pd.cut(df['A'], bins=buckets, labels=False)
1000 loops, best of 3: 460 µs per loop # @root's soln

In [525]: buckets = [(0,3),(3,5),(5,9)]

In [526]: %timeit np.asarray(buckets)[:,1].searchsorted(df.A.values)
10000 loops, best of 3: 166 µs per loop

外界限制案例:对于这种情况,我们需要使用裁剪,如此 -

np.asarray(buckets)[:,1].searchsorted(df.A.values).clip(max=len(buckets)-1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM