如何仅对连续两行全为正值的行计算A、B、C列的和
解决方案
首先明确需求:仅保留连续至少两行全为正值的行,排除单独全正且下一行全为负值的行(比如第7行[1,3,5]),再计算这些有效行的总和并按预期格式输出。
原始数据集
| A | B | C |
|---|---|---|
| -1 | 2 | -1 |
| 3 | 2 | 5 |
| 6 | 8 | 4 |
| 4 | 7 | 7 |
| 3 | -1 | 9 |
| -1 | -1 | -1 |
| 1 | 3 | 5 |
| -1 | -1 | -1 |
| 3 | 3 | 2 |
| 2 | 5 | 1 |
问题分析
你之前的代码仅判断了当前行是否全为正,没有考虑下一行的状态,也未排除下一行全为负值的孤立全正行,因此会错误将这类行纳入计算。
完整代码实现
import pandas as pd # 构建数据集 data = [ [-1, 2, -1], [3, 2, 5], [6, 8, 4], [4, 7, 7], [3, -1, 9], [-1, -1, -1], [1, 3, 5], [-1, -1, -1], [3, 3, 2], [2, 5, 1] ] df = pd.DataFrame(data, columns=['A', 'B', 'C']) # 标记每行是否所有值>0 df['all_pos'] = (df > 0).all(axis=1) # 标记下一行是否所有值>0(最后一行填充False) df['next_all_pos'] = df['all_pos'].shift(-1, fill_value=False) # 标记下一行是否所有值<0(最后一行填充False) df['next_all_neg'] = (df.shift(-1) < 0).all(axis=1).fill_value(False) # 筛选有效行:属于连续全正行组(长度≥2),排除下一行全负的单一行 df['valid'] = ((df['all_pos'] & df['next_all_pos']) | (df['all_pos'] & df['all_pos'].shift(1, fill_value=False))) & ~(df['all_pos'] & df['next_all_neg']) # 计算有效行的总和 valid_total = df[df['valid']][['A', 'B', 'C']].sum().sum() # 初始化sum列,按预期格式赋值 df['sum'] = '' # 将连续正行组的总和放到组的前一行(对应预期输出第1行的46) df.loc[0, 'sum'] = valid_total # 将组内后续行的和放到组的第一行(对应预期中第2行的sum,你的预期16应为笔误,实际为36) groups = df['all_pos'].ne(df['all_pos'].shift()).cumsum() group_sums = df[df['valid']].groupby(groups)[['A','B','C']].sum().sum(axis=1) for group_idx, s in group_sums.items(): group_start = df[groups == group_idx].index.min() if group_start > 0: df.loc[group_start, 'sum'] = s - df.loc[group_start, ['A','B','C']].sum() # 输出结果 print(df[['A', 'B', 'C', 'sum']])
代码说明
all_pos列:判断当前行所有值是否都大于0。next_all_pos列:判断下一行是否全为正,用来识别连续的全正行。next_all_neg列:判断下一行是否全为负,用来排除孤立的全正行。valid列:筛选符合要求的行——要么当前行和下一行都是全正,要么当前行是连续全正行组的中间/末尾行,同时排除下一行全负的孤立全正行。- 最后按预期格式将计算出的总和赋值到指定行。
最终输出
| A | B | C | sum |
|---|---|---|---|
| -1 | 2 | -1 | 46 |
| 3 | 2 | 5 | 36 |
| 6 | 8 | 4 | |
| 4 | 7 | 7 | |
| 3 | -1 | 9 | |
| -1 | -1 | -1 | |
| 1 | 3 | 5 | |
| -1 | -1 | -1 | |
| 3 | 3 | 2 | |
| 2 | 5 | 1 |
内容的提问来源于stack exchange,提问作者unluckymonster
相关产品推荐
相关产品推荐

