如何为DataFrame按ID统计X/Y列的行间滚动变更计数?
解决方案
步骤说明
要实现按标识ID分组,计算X/Y列随时间的滚动变更计数,核心逻辑是:
- 每组第一行的变更计数为0
- 后续行若与上一行值不同,变更计数为上一行计数+1;若相同则重置为0
完整代码实现
import pandas as pd # 构建示例DataFrame data = { '标识ID': [123, 123, 123, 124, 124, 124], '日期(日/月/年)': ['01/01/2022', '02/01/2022', '03/01/2022', '01/01/2022', '02/01/2022', '03/01/2022'], 'X': [100, 200, 300, 200, 900, 900], 'Y': ['abc', 'acb', 'ary', 'abc', 'abc', 'abc'] } df = pd.DataFrame(data) # 转换日期格式并按标识ID+日期排序(确保时间顺序正确) df['日期(日/月/年)'] = pd.to_datetime(df['日期(日/月/年)'], format='%d/%m/%Y') df = df.sort_values(['标识ID', '日期(日/月/年)']).reset_index(drop=True) # 定义变更计数计算函数 def calculate_change(col): change = [0] for idx in range(1, len(col)): if col.iloc[idx] != col.iloc[idx-1]: change.append(change[-1] + 1) else: change.append(0) return pd.Series(change, index=col.index) # 分组计算Change X和Change Y列 df['Change X'] = df.groupby('标识ID')['X'].apply(calculate_change) df['Change Y'] = df.groupby('标识ID')['Y'].apply(calculate_change) # 查看结果 print(df)
输出结果
| 标识ID | 日期(日/月/年) | X | Y | Change X | Change Y |
|---|---|---|---|---|---|
| 123 | 2022-01-01 | 100 | abc | 0 | 0 |
| 123 | 2022-01-02 | 200 | acb | 1 | 1 |
| 123 | 2022-01-03 | 300 | ary | 2 | 2 |
| 124 | 2022-01-01 | 200 | abc | 0 | 0 |
| 124 | 2022-01-02 | 900 | abc | 1 | 0 |
| 124 | 2022-01-03 | 900 | abc | 0 | 0 |
内容的提问来源于stack exchange,提问作者Mitchell
相关产品推荐
相关产品推荐

