如何在Pandas倒序分组后,若组首元素为1则置组内其余元素为0
DataFrame倒序分组后按组首值修改组内元素
原始数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'day': [1,2,3,4,5,6,7,8], 'first mover': [1,1,0,0,0,1,0,1] })
对应表格:
| day | first mover |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 0 |
| 4 | 0 |
| 5 | 0 |
| 6 | 1 |
| 7 | 0 |
| 8 | 1 |
需求
将DataFrame按从下到上(倒序)每4行分组,若每组首行的first mover值为1,则将组内其余所有行的first mover设为0,最终恢复原行顺序。
完整实现代码
N = 4 processed_df = ( df.iloc[::-1] # 倒序数据,将"从下到上分组"转为常规的从上到下分组 .groupby(np.arange(len(df)) // N) # 生成每4行一组的分组键 .apply(lambda g: g.assign( **{'first mover': np.where(g.index != g.index[0], 0, g['first mover']) if g['first mover'].iloc[0] == 1 else g['first mover']} )) .reset_index(level=0, drop=True) # 移除分组产生的额外索引 .iloc[::-1] # 恢复原数据的行顺序 ) print(processed_df)
代码逻辑说明
- 倒序数据:
df.iloc[::-1]反转原数据,把"从下到上每4行分组"转化为反转后从上到下的常规分组,简化操作。 - 分组:
np.arange(len(df))//N生成连续整数分组键,确保每4行被分到同一组。 - 组内修改逻辑:
- 对每个分组,先判断组内第一行的
first mover是否为1; - 若是,用
np.where将组内除第一行外的所有first mover设为0,第一行保留原值; - 若不是,保持组内数据不变。
- 对每个分组,先判断组内第一行的
- 恢复原顺序:处理完成后再次反转数据,得到符合原行顺序的结果。
输出结果
day first mover 0 1 1 1 2 0 2 3 0 3 4 0 4 5 0 5 6 0 6 7 0 7 8 0
内容的提问来源于stack exchange,提问作者prem
相关产品推荐
相关产品推荐

