如何在Pandas中按条件对指定列外的月度列执行除法操作
Pandas:仅对指定行的月度列执行除以100操作
需求
当数据框中View Description列值为Percent change时,将除Series ID、Country外的所有月度列(列数量较多无法手动指定)的值除以100,其余行保持原值。
输入数据
Series ID View Description Jan Feb Mar Apr Country Food Percent change 219.98 210.98 205 202 Italy Drinks Original Data Value 215.46 205.04 206 203 France Food at Home Original Data Value 202.88 203 207 199 Angola
已尝试的错误方法及问题分析
- 带if语句的for循环:
for i in df1: if df1['View Description'] == 'Percent change': df1 = df1.set_index(['Series ID', 'View Description', 'Year']).div(100).reset_index() else:
- 问题:
df1['View Description'] == 'Percent change'返回布尔序列,不能直接用于if判断;输入数据无Year列,且该操作会对全表做除法,而非仅目标行。
- 掩码方法:
cols = ['Series ID', 'View Description'] mask = final_df['View Description'] == 'Percent change' final_df.loc[mask, final_df.columns != cols] = final_df.loc[mask, final_df.columns != cols].div(100).reset_index()
- 问题:
final_df.columns != cols列筛选写法错误,应使用~final_df.columns.isin(cols);多余的.reset_index()会导致赋值维度不匹配。
期望输出
Series ID View Description Jan Feb Mar Apr Country Food Percent change 2.1998 2.1098 2.05 2.02 Italy Drinks Original Data Value 215.46 205.04 206 203 France Food at Home Original Data Value 202.88 203 207 199 Angola
正确实现方案
方法1:矢量化掩码+列筛选(推荐)
利用Pandas矢量化操作,无需循环,效率更高:
import pandas as pd # 构造示例数据 data = { 'Series ID': ['Food', 'Drinks', 'Food at Home'], 'View Description': ['Percent change', 'Original Data Value', 'Original Data Value'], 'Jan': [219.98, 215.46, 202.88], 'Feb': [210.98, 205.04, 203], 'Mar': [205, 206, 207], 'Apr': [202, 203, 199], 'Country': ['Italy', 'France', 'Angola'] } df = pd.DataFrame(data) # 定义需要排除的非月度列 exclude_cols = ['Series ID', 'Country', 'View Description'] # 自动筛选出所有月度列 month_cols = df.columns.difference(exclude_cols) # 定位需要处理的行 mask = df['View Description'] == 'Percent change' # 对目标行的月度列执行除法 df.loc[mask, month_cols] = df.loc[mask, month_cols].div(100) print(df)
方法2:优化原掩码方法
修正原方法的错误点:
cols = ['Series ID', 'View Description', 'Country'] mask = df['View Description'] == 'Percent change' # 正确筛选列并移除多余的reset_index() df.loc[mask, ~df.columns.isin(cols)] = df.loc[mask, ~df.columns.isin(cols)].div(100)
内容的提问来源于stack exchange,提问作者Linear17
相关产品推荐
相关产品推荐

