如何遍历DataFrame列统计相邻列差异次数并更新Aggregate列
问题:统计DataFrame每行相邻列值变化次数
我的DataFrame包含1000列,列值范围为0-4。初始数据如下:
| City | Q1 | Q2 | Q3 | Q4 | Aggregate |
|---|---|---|---|---|---|
| Newcastle | 2 | 3 | 3 | 0 | 0 |
| Liverpool | 4 | 2 | 1 | 4 | 0 |
| Cardiff | 2 | 2 | 2 | 3 | 0 |
| Glasgow | 0 | 1 | 3 | 1 | 0 |
需求:每当相邻两列值不相等时,给Aggregate列加1,最终效果如下:
| City | Q1 | Q2 | Q3 | Q4 | Aggregate |
|---|---|---|---|---|---|
| Newcastle | 2 | 3 | 3 | 0 | 2 |
| Liverpool | 4 | 2 | 1 | 4 | 3 |
| Cardiff | 2 | 2 | 2 | 3 | 1 |
| Glasgow | 0 | 1 | 3 | 1 | 3 |
我一开始的思路是逐个判断相邻列:
if df['Q1'] != df['Q2']: df['Aggregate'] + 1 else: pass
接着再判断Q2和Q3:
if df['Q2'] != df['Q3']: df['Aggregate'] + 1 else: pass
但这样没法高效遍历1000列,希望找到能统计每行总变化次数的方法。
解决方案
可以利用Pandas的移位和聚合操作实现高效统计,无需手动遍历每一列:
import pandas as pd # 提取需要对比的数值列(排除City和初始Aggregate列) value_cols = df.columns.difference(['City', 'Aggregate']) # 计算每行相邻列的差异次数:右移列后与原列比较,统计不相等的数量 df['Aggregate'] = (df[value_cols] != df[value_cols].shift(axis=1)).sum(axis=1)
代码说明:
columns.difference(['City', 'Aggregate']):筛选出所有需要对比的数值列,自动适配1000列的场景shift(axis=1):将每行的列值向右移动一位,使得原列与移位后的列对应位置为相邻的两列!=:逐元素比较原列和移位后的列,得到布尔值DataFrame(不相等为True)sum(axis=1):对每行的布尔值求和,True会被视为1,False视为0,结果就是该行相邻列值变化的总次数,直接赋值给Aggregate列
内容的提问来源于stack exchange,提问作者gorilla
相关产品推荐
相关产品推荐

