You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于行号为Pandas DataFrame按每4行分配递增Group_ID?

问题:为Pandas DataFrame按行分配分组ID

想要基于行计数为Pandas DataFrame分配分组ID,规则为每4个连续行对应一个ID,最终DataFrame示例如下:

col_1    Group_ID
   v_1        1
   v_2        1
   v_3        1
   v_4        1
   v_5        2
   v_6        2
   v_7        2
   v_8        2
   v_9        3
   v_10       3

--- And so on.

原本通过以下循环逻辑实现该需求:

num = df.shape[0]
for i in range(num):
   print(math.ceil(i/4))

现在想使用apply函数结合df.index来实现,请问以下代码是否可行?求相关提示。

df['Index'] = df.index
df[GroupID] = df['Index'].apply(np.ceil)

你的代码不可行,问题出在两点:

  1. GroupID没有加引号,会被Python当成未定义变量,直接报错;
  2. 直接对索引调用np.ceil没有意义,你需要先把索引除以4再取上整,才能得到分组ID。

推荐实现方式(无需apply,效率更高)

Pandas支持矢量化操作,直接用索引计算就行,比循环和apply快得多:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({'col_1': [f'v_{i+1}' for i in range(10)]})

# 计算分组ID:索引从0开始,每4行一组
df['Group_ID'] = (df.index // 4) + 1

或者用np.ceil的写法(结果一致):

import numpy as np
df['Group_ID'] = np.ceil((df.index + 1)/4).astype(int)

如果一定要用apply(不推荐)

如果坚持要用apply,需要修正代码,通过lambda函数先做除法再取上整,同时给列名加引号:

import numpy as np

df['Index'] = df.index
df['Group_ID'] = df['Index'].apply(lambda x: np.ceil(x/4))
# 也可以用math.ceil:
# import math
# df['Group_ID'] = df['Index'].apply(lambda x: math.ceil(x/4))

注意:apply本质是逐行循环,数据量大的时候效率远低于矢量化操作,所以优先用第一种方案。

内容的提问来源于stack exchange,提问作者pythondumb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:45:26