Pandas:如何按行求和条件修改DataFrame指定列的值
解决方案:基于行求和条件修改指定列值
核心思路
先筛选出「Q1 24至Q4 24行和处于1-2.5区间」的行,再分别对前三列(Q1/Q2/Q3 24)和第四列(Q4 24)赋值,避免之前批量赋值导致的全列设为2的问题。
代码实现(结合iloc)
假设你可以通过列名定位目标列的位置,或者已经知道列的索引:
步骤1:获取目标列的位置索引
如果不确定列的具体索引,用get_loc或get_indexer快速获取:
# 批量获取四个目标列的索引数组 target_cols_idx = df.columns.get_indexer(['Q1 24', 'Q2 24', 'Q3 24', 'Q4 24']) # 或者单独获取每个列的索引 q1_idx = df.columns.get_loc('Q1 24') q2_idx = df.columns.get_loc('Q2 24') q3_idx = df.columns.get_loc('Q3 24') q4_idx = df.columns.get_loc('Q4 24')
步骤2:生成条件掩码
计算目标列的行求和,筛选出符合区间的行:
# 计算Q1-Q4 24的行求和 row_sums = df.iloc[:, target_cols_idx].sum(axis=1) # 生成布尔掩码,标记符合条件的行 mask = (row_sums >= 1) & (row_sums <= 2.5)
步骤3:精准修改指定列
用iloc定位行和列,分别赋值:
# 将Q1/Q2/Q3 24设为0 df.iloc[mask.values, target_cols_idx[:3]] = 0 # 将Q4 24设为2 df.iloc[mask.values, target_cols_idx[3]] = 2
补充说明
- 使用
mask.values是为了避免索引对齐问题,确保iloc能精准识别需要修改的行; - 如果目标列是连续排列的,也可以直接用切片(比如
df.iloc[:, 6:10])代替target_cols_idx,前提是你确认列的顺序和位置; - 若习惯用列名操作,也可以用
loc实现相同逻辑:df.loc[mask, ['Q1 24', 'Q2 24', 'Q3 24']] = 0 df.loc[mask, 'Q4 24'] = 2
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

