Pandas数据分组需求:按正负连续序列合并尾随0分组
没问题,我来帮你搞定这个分组需求!咱们可以通过Pandas结合Numpy一步步实现你要的效果,思路和代码如下:
核心思路
- 先给每个
x值标记类型:负数标记为-1,正数标记为1,0暂时转为NaN - 用向前填充的方式,让所有0继承前面最近的非0值的类型(这样单个或连续的0就会自动归入前序的正负组)
- 根据类型的变化生成分组ID,连续相同类型的元素会被分到同一组
- 最后按分组ID提取每组的
x值即可
完整代码实现
import pandas as pd import numpy as np # 先构造你提供的DataFrame data = { 'x': [-5, -7, -3, 0, 1, 6, 3, 0, 0, -10, -9, -8, 11, 17, 13, 0, 0, 0, 0, 0, -1, -9, -3], 'y': [25, 32, 33, 22, 16, 10, 36, 22, 55, 24, 32, 5, 4, 9, 88, 14, 12, 0, 10, 96, 492, -440, 34] } df = pd.DataFrame(data) # 1. 标记类型并处理0的归属 df['group_type'] = np.sign(df['x']).replace(0, np.nan) # 把0转为NaN,方便后续填充 df['group_type'] = df['group_type'].ffill() # 向前填充,让0继承前序非0类型 # 2. 生成分组ID:当类型变化时,分组ID+1 df['group_id'] = (df['group_type'] != df['group_type'].shift(1)).cumsum() # 3. 提取每个组的x值 groups = df.groupby('group_id')['x'].apply(list).tolist() # 输出你要的格式 for idx, group in enumerate(groups, 1): print(f'data{idx} = {group}')
运行结果
执行代码后会输出:
data1 = [-5, -7, -3, 0] data2 = [1, 6, 3, 0, 0] data3 = [-10, -9, -8] data4 = [11, 17, 13, 0, 0, 0, 0, 0] data5 = [-1, -9, -3]
刚好完全匹配你想要的拆分结果!如果后续数据有开头就出现0的情况,你可以根据需求额外处理(比如单独分组或者过滤掉),当前代码已经完美适配你提供的数据集啦。
内容的提问来源于stack exchange,提问作者RandyRandelson
相关产品推荐
相关产品推荐

