如何在满足条件时用Pandas DataFrames实现单元格+1计数
Pandas条件更新与统计问题解答
问题1:如何在满足if条件时,使用Pandas DataFrames将单元格的值加1?
有两种高效实现方式:
- 单个单元格更新:使用
df.at[row_index, column_name] += 1,精准定位单个单元格并累加,适合目标明确的场景。 - 批量行更新:通过布尔索引配合
loc实现向量化操作,比如df.loc[df['判断列'] == 条件, '目标列'] += 1,这种方式无需遍历每行,处理大数据集时效率极高。
问题2:检测CSV同一行两列值相等时,更新另一个DataFrame对应单元格并统计次数
针对你的需求,原代码的while循环遍历效率极低,推荐用Pandas向量化操作优化,完整方案如下:
优化思路
- 建立活动编码与目标列名的映射字典,避免重复编写判断逻辑;
- 筛选出两列值相等的行,统计各类活动的匹配次数;
- 批量更新目标DataFrame的对应单元格。
完整优化代码
import pandas as pd # 读取数据集 final_activities = pd.read_csv( "VPN2/VPN2_Final_Activities.csv", delimiter=';', names=['Timerels', 'ActivityClass_Ankle', 'ActivityClass_Hip', 'ActivityClass_Thigh', 'ActivityClass_Wrist', 'ActivityClass_Annotation'], skip_blank_lines=True, skipinitialspace=True, engine='python', header=0 ) matricsFile = pd.read_csv( "VPN2/VPN2_Final_Matrics.csv", delimiter=';', names=['lying', 'cycling', 'ascending stairs', 'jogging', 'descending stairs', 'walking', 'standing', 'sitting', 'unknown'], skip_blank_lines=True, skipinitialspace=True, engine='python', header=0 ) # 活动编码与列名的映射关系 activity_mapping = { 1: 'lying', 3: 'cycling', 4: 'ascending stairs', 5: 'jogging', 6: 'descending stairs', 7: 'walking', 9: 'standing', 11: 'sitting', 0: 'unknown' } # 转换列类型为整数,确保匹配准确 final_activities['ActivityClass_Annotation'] = final_activities['ActivityClass_Annotation'].astype(int) final_activities['ActivityClass_Ankle'] = final_activities['ActivityClass_Ankle'].astype(int) # 筛选两列值相等的行,并统计每个活动的出现次数 matched_rows = final_activities[final_activities['ActivityClass_Annotation'] == final_activities['ActivityClass_Ankle']] match_counts = matched_rows['ActivityClass_Annotation'].value_counts().to_dict() # 更新matricsFile中的对应单元格 for code, col_name in activity_mapping.items(): if code in match_counts: matricsFile.at[1, col_name] += match_counts[code] # 可选:保存更新后的统计文件 # matricsFile.to_csv("VPN2/VPN2_Final_Matrics_Updated.csv", sep=';', index=False)
优化优势
- 效率提升:向量化操作基于底层C实现,相比逐行循环,处理大数据集时速度提升数十倍;
- 代码简洁:映射字典统一管理活动编码与列名,新增或修改活动只需调整字典,无需修改多处判断逻辑;
- 稳定性高:避免循环中可能出现的索引错误,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Edwin von Lemberg
相关产品推荐
相关产品推荐

