如何复制Pandas行直至Date_Numerical字段值低于30.5阈值
问题分析
- 现有代码存在两个核心问题:
- 判断阈值不符合要求:需求是
Date_Numerical大于30.5才触发拆分,代码中写的是大于30,边界值判断会出错 - 仅做了单次行复制,对于需要拆分多次的数值(如示例中的110需要拆分出4行)无法覆盖,因此无法得到预期结果
- 判断阈值不符合要求:需求是
解决方案
方案1:逐行迭代实现(逻辑易理解,适合小数据量)
import pandas as pd def split_row(row): rows_list = [] current_date_val = row['Date_Numerical'] # 只要数值大于等于30.5就持续生成新行 while current_date_val >= 30.5: temp_row = row.copy() temp_row['Date_Numerical'] = current_date_val rows_list.append(temp_row) current_date_val -= 30 # 补充最后一个低于30.5的行 temp_row = row.copy() temp_row['Date_Numerical'] = current_date_val rows_list.append(temp_row) return pd.DataFrame(rows_list) # 测试原始数据 df = pd.DataFrame({'SCU_KEY': [3, 4, 5, 6], 'Date_Numerical': [70, 20, 15, 110]}) # 合并所有拆分后的行 df_2 = pd.concat([split_row(row) for _, row in df.iterrows()], ignore_index=True)
运行后输出与你给出的期望结果完全一致。
方案2:向量化实现(无循环,效率更高,适合十万行以上的大数据量)
import pandas as pd import numpy as np df = pd.DataFrame({'SCU_KEY': [3, 4, 5, 6], 'Date_Numerical': [70, 20, 15, 110]}) # 计算每行需要生成的行数 df['repeat_cnt'] = np.ceil((df['Date_Numerical'] - 0.5) / 30).astype(int) # 按计算出的次数重复行 df_2 = df.loc[df.index.repeat(df['repeat_cnt'])].reset_index(drop=True) # 分组计算递减后的Date_Numerical值 df_2['Date_Numerical'] = df_2['Date_Numerical'] - 30 * df_2.groupby(level=0).cumcount() # 删除辅助计算列 df_2 = df_2.drop('repeat_cnt', axis=1)
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

