如何编写函数对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
相关产品推荐
相关产品推荐

