如何在Pandas DataFrame中按条件拆分Code与Amount列
解决方案
步骤1:转换金额格式
原始Amount列是带$的字符串,无法直接进行数值计算,先将其转换为浮点型:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Code': [1, 1], 'Amount': ['$40.00', '$20.00'] }) # 移除$符号并转为数值 df['Amount_num'] = df['Amount'].str.replace('$', '', regex=False).astype(float)
步骤2:计算拆分后的金额
按照规则依次计算三笔金额:
Amount1:最多取$5.00,若原金额不足5则取全额Amount2:原金额减去Amount1后,最多取$10.00,剩余不足10则取剩余值,无剩余则为0Amount3:原金额减去前两笔的剩余部分
# 计算Amount1 df['Amount1'] = df['Amount_num'].apply(lambda x: min(x, 5.00)) # 计算扣除Amount1后的剩余金额 remaining_after_1 = df['Amount_num'] - df['Amount1'] # 计算Amount2 df['Amount2'] = remaining_after_1.apply(lambda x: min(x, 10.00) if x > 0 else 0) # 计算Amount3 df['Amount3'] = df['Amount_num'] - df['Amount1'] - df['Amount2']
步骤3:生成对应Code列
将原Code转为字符串后拼接.1/.2/.3:
df['Code1'] = df['Code'].astype(str) + '.1' df['Code2'] = df['Code'].astype(str) + '.2' df['Code3'] = df['Code'].astype(str) + '.3'
步骤4:格式化金额并整理列顺序
把拆分后的金额转回带$的格式,然后调整列顺序得到最终结果:
# 格式化金额为$X.XX格式 df['Amount1'] = df['Amount1'].apply(lambda x: f'${x:.2f}') df['Amount2'] = df['Amount2'].apply(lambda x: f'${x:.2f}') df['Amount3'] = df['Amount3'].apply(lambda x: f'${x:.2f}') # 整理最终列,移除中间辅助列Amount_num final_df = df[['Code', 'Amount', 'Code1', 'Amount1', 'Code2', 'Amount2', 'Code3', 'Amount3']] print(final_df)
常见问题说明
如果之前用apply未得到预期结果,大概率是以下原因:
- 未将
Amount列转为数值类型,直接对字符串进行计算导致逻辑错误 - 拆分金额时顺序错误,比如先算10刀再算5刀,不符合规则要求
- 未处理金额不足的边界情况(比如原金额小于5时,Amount2和Amount3应为0)
运行上述代码后,即可得到你需要的预期输出。
内容的提问来源于stack exchange,提问作者S_Python
相关产品推荐
相关产品推荐

