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

如何对含计数的DataFrame执行类pd.explode展开以适配逻辑回归?

高效实现逻辑回归数据的行扩展转换

现有如下数据结构,需要将每组的total值拆分为对应行数,其中前occurrence行的目标值为1,剩余行为0:

import pandas as pd
df = pd.DataFrame({"group": ["A", "B"], "total": [3, 5], "occurrence": [2, 1]})

你当前用嵌套循环的方式实现,但大数据集下速度极慢。这里提供两种高效的向量化实现方案:

方案一:基于分组累计计数的高效实现

这种方法利用pandas的repeat扩展行,结合分组累计计数判断目标值,完全避免Python层面的循环,性能最优:

# 按total值重复每行,扩展成目标行数
df_expanded = df.loc[df.index.repeat(df['total'])].reset_index(drop=True)
# 按group分组,计算组内的行序号(从0开始)
df_expanded['row_num'] = df_expanded.groupby('group').cumcount()
# 生成目标列y:行序号小于occurrence则为1,否则为0
df_expanded['y'] = (df_expanded['row_num'] < df_expanded['occurrence']).astype(int)
# 清理不需要的列
df_out = df_expanded.drop(['total', 'occurrence', 'row_num'], axis=1)

执行后输出结果:

group  y
0     A  1
1     A  1
2     A  0
3     B  1
4     B  0
5     B  0
6     B  0
7     B  0

方案二:构造列表后explode

如果数据量不是极大,也可以通过构造目标值列表再拆分的方式实现,代码更简洁:

# 为每行构造包含对应数量1和0的列表
df['y_list'] = df.apply(lambda x: [1]*x['occurrence'] + [0]*(x['total'] - x['occurrence']), axis=1)
# 拆分列表为行,并重命名列,清理冗余列
df_out = df.explode('y_list').rename(columns={'y_list':'y'}).drop(['total', 'occurrence'], axis=1).reset_index(drop=True)

两种方案都比循环实现快得多,其中方案一在大数据集下内存占用更低、速度更快,因为不需要提前构造大列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:15:01