使用Python Apply函数扩展数据集天数及处理劳动占比的技术问询
解决方案
核心思路
先按ID+PHASENAME提取每个分组的关键元数据(现有最大DAY_COUNTER、固定的C_DAYS和Multi_Factor),批量生成扩展至100天的记录,再用向量化操作计算DAILY_LABOR_PERCENT,全程避免冗余计算,同时适配大数据集。
高效实现代码(Pandas)
import pandas as pd # 假设原始数据集为df,替换为你的实际数据源导入方式 df = pd.read_csv('your_raw_data.csv') # 1. 提取分组元数据:每个分组的最大现有天数、固定字段值 group_meta = df.groupby(['ID', 'PHASENAME']).agg( max_day=('DAY_COUNTER', 'max'), C_DAYS=('C_DAYS', 'first'), # 假设每个分组内C_DAYS值固定 Multi_Factor=('Multi_Factor', 'first') # 假设每个分组内Multi_Factor值固定 ).reset_index() # 2. 筛选出需要扩展的分组(现有最大天数小于100) need_expand = group_meta[group_meta['max_day'] < 100] # 3. 批量生成扩展天数记录(用explode替代循环,提升效率) need_expand['day_sequence'] = need_expand.apply( lambda row: list(range(row['max_day'] + 1, 101)), axis=1 ) expanded_records = need_expand.explode('day_sequence').rename(columns={'day_sequence': 'DAY_COUNTER'}) expanded_records['DAY_COUNTER'] = expanded_records['DAY_COUNTER'].astype(int) # 4. 计算扩展记录的DAILY_LABOR_PERCENT # 按需求执行:DAILY_LABOR_PERCENT = DAY_COUNTER * Multi_Factor expanded_records['DAILY_LABOR_PERCENT'] = expanded_records['DAY_COUNTER'] * expanded_records['Multi_Factor'] # 若需调整原数据的DAILY_LABOR_PERCENT(按DAILY_LABOR_PERCENT/Multi_Factor),执行以下行: # df['DAILY_LABOR_PERCENT'] = df['DAILY_LABOR_PERCENT'] / df['Multi_Factor'] # 5. 合并原数据与扩展数据,排序后输出 final_df = pd.concat( [df, expanded_records.drop(columns=['max_day'])], ignore_index=True ).sort_values(['ID', 'PHASENAME', 'DAY_COUNTER']).reset_index(drop=True) # 保存结果 final_df.to_csv('expanded_data.csv', index=False)
解决重复计算与大数据适配的关键点
- 避免冗余计算:仅提取一次分组元数据,扩展记录只生成一次,不会重复处理同一分组的字段计算
- 向量化操作代替循环:用
explode批量生成扩展序列,替代逐行循环;字段计算用Pandas内置的向量化运算,比逐行处理效率提升10~100倍 - 大数据集优化:如果数据量超千万级,可替换为
Dask DataFrame(API与Pandas兼容),支持分块并行处理,避免内存溢出 - 无重复行:合并后通过排序保证记录顺序,同时
ignore_index=True避免索引重复
内容的提问来源于stack exchange,提问作者Ty Kendall
相关产品推荐
相关产品推荐

