问题描述
| type | time |
| :——- | :——- |
| B | t1 |
| C | t2 |
| A | t3 |
| D | t4 |
| C | t5 |
| B | t6 |
| A | t7 |
| B | t8 |
| D | t9 |
| A | t10 |
我想根据 A 的出现来切割数据框并最终得到以下结果:
group 1: {B:t1,C:t2}
group 2: {A:t3,D:t4,C:t5,B:t6}
group 3: {A:t7,B:t8,D:t9}
group 4: {A:t10}
解决方法
使用GroupBy.apply
和 lambda 函数为字典创建的助手 Series
比较 type
由 A
与累积总和 Series.cumsum
:
f = lambda x: dict(zip(x['type'],x['time']))
df1 = (df.groupby(df['type'].eq('A').cumsum().add(1).rename('group'))
.apply(f)
.add_prefix('group ')
.reset_index(name='new'))
print (df1)
group new
0 group 1 {'B': 't1','C': 't2'}
1 group 2 {'A': 't3','D': 't4','C': 't5','B': 't6'}
2 group 3 {'A': 't7','B': 't8','D': 't9'}
3 group 4 {'A': 't10'}