如何基于行号为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)
你的代码不可行,问题出在两点:
GroupID没有加引号,会被Python当成未定义变量,直接报错;- 直接对索引调用
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
相关产品推荐
相关产品推荐

