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

如何在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则取剩余值,无剩余则为0
  • Amount3:原金额减去前两笔的剩余部分
# 计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:42:47