如何为DataFrame中单调递增序列分组并添加分组列?
嘿,这个场景太常见了!用循环确实效率堪忧,尤其是数据量上去之后,咱们直接用Pandas的矢量化操作就能轻松搞定,速度快到飞起~
核心思路很简单:找到每一段递增序列的起始点(也就是当前x比前一个x小的位置),然后对这些起始点做累加,就能得到分组的y值了。
直接上代码:
import pandas as pd # 先构造你的示例数据 df = pd.DataFrame({'x': [1,2,3,4,1,2,3,1,2,3,4,5,6,1,2]}) # 一步到位生成y列 df['y'] = (df['x'].diff() < 0).cumsum() + 1 # 看看结果 print(df)
运行后输出的结果完全符合你的需求:
x y 0 1 1 1 2 1 2 3 1 3 4 1 4 1 2 5 2 2 6 3 2 7 1 3 8 2 3 9 3 3 10 4 3 11 5 3 12 6 3 13 1 4 14 2 4
我来拆解一下每一步的逻辑:
df['x'].diff():计算当前行x和前一行x的差值,第一行因为没有前一行,结果是NaN。(df['x'].diff() < 0):判断差值是否小于0——如果是,说明当前x比前一个小,意味着新的递增序列开始了,标记为True;其他情况(包括第一行的NaN)标记为False。.cumsum():对标记列做累加,每遇到一个True,累加值就加1,这样就得到了分组的基准序号(从0开始)。+1:把基准序号加1,正好对应你需要的1、2、3、4分组编号。
这种方法完全是矢量化运算,避免了循环遍历,数据量越大,效率优势越明显,绝对比循环靠谱多了~
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

