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

如何编写函数对DataFrame特定行应用指定百分比变动?

为Pandas DataFrame特定行应用百分比变化的实现方案

原始场景

现有如下Pandas DataFrame:

# 初始化数据列表
data = [['tom', 10], ['nick', 15], ['juli', 14]]
  
# 创建DataFrame
df = pd.DataFrame(data, columns=['Name', 'Amount'])

需求是编写一个函数,根据传入的姓名和百分比值,对对应行的Amount字段应用百分比调整(原始尝试为按比例减少数值)。用户的尝试代码如下:

def function(x, pct):
    
    if df['Name'] == x:
        df['Amount'] = df['Amount'] - (df['Amount'] * pct), df['Amount']
    else:
        df['Amount'] = df['Amount']
    
    return df

这段代码存在几个问题:直接依赖全局变量df、条件判断因Series比较报错、赋值逻辑错误(逗号导致生成元组)。

修正后的实现

核心改进点

  • 将DataFrame作为参数传入函数,避免依赖全局变量,提升函数通用性
  • 使用df.loc精准定位目标行,避免赋值时出现警告或错误
  • 简化百分比计算逻辑,确保数值调整正确

完整函数代码

def adjust_amount(df, target_name, pct):
    # 复制原DataFrame,防止修改原始数据(若需直接修改原数据可去掉.copy())
    result_df = df.copy()
    # 筛选目标姓名的行,调整Amount值
    result_df.loc[result_df['Name'] == target_name, 'Amount'] *= (1 - pct)
    return result_df

使用示例

# 调用函数,将tom的Amount减少20%
updated_df = adjust_amount(df, 'tom', 0.2)
print(updated_df)

输出结果:

Name  Amount
0    tom     8.0
1   nick    15.0
2   juli    14.0

扩展说明

如果需要同时处理多个姓名,只需修改筛选条件为isin:

def adjust_amount_multi(df, target_names, pct):
    result_df = df.copy()
    result_df.loc[result_df['Name'].isin(target_names), 'Amount'] *= (1 - pct)
    return result_df

# 同时调整tom和nick的数值
updated_df = adjust_amount_multi(df, ['tom', 'nick'], 0.1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:33:29