pandas - 如何将其他列中的连续值分组为基于一列的范围
问题描述
我有以下数据框:
我想从数据框中得到以下输出
无论如何使用groupby聚合函数,pandas中的pivot_table根据列'A'对其他列['B','index']进行分组。
我想不出一种编写代码的方法。
解决方案
利用:
df=df.reset_index() #if 'index' not is a colum
g=df['A'].ne(df['A'].shift()).cumsum()
new_df=df.groupby(g,as_index=False).agg(index=('index',list),A=('A','first'),B=('B',lambda x: list(x.unique())))
print(new_df)
在熊猫 <0.25 中:
new_df=df.groupby(g,as_index=False).agg({'index':list,'A':'first','B':lambda x: list(x.unique())})
如果要在索引中重复重复,请对索引列使用与 B 相同的函数:
new_df=df.groupby(g,as_index=False).agg(index=('index',lambda x: list(x.unique())),A=('A','first'),B=('B',lambda x: list(x.unique())))
print(new_df)
这是一个例子:
df=pd.DataFrame({'index':range(20),
'A':[1,1,1,1,2,2,0,0,0,1,1,1,1,1,1,0,0,0,3,3]
,'B':[1,2,3,5,5,5,7,8,9,9,9,12,12,14,15,16,17,18,19,20]})
print(df)
index A B
0 0 1 1
1 1 1 2
2 2 1 3
3 3 1 5
4 4 2 5
5 5 2 5
6 6 0 7
7 7 0 8
8 8 0 9
9 9 1 9
10 10 1 9
11 11 1 12
12 12 1 12
13 13 1 14
14 14 1 15
15 15 0 16
16 16 0 17
17 17 0 18
18 18 3 19
19 19 3 20
g=df['A'].ne(df['A'].shift()).cumsum()
new_df=df.groupby(g,as_index=False).agg(index=('index',list),A=('A','first'),B=('B',lambda x: list(x.unique())))
print(new_df)
index A B
0 [0, 1, 2, 3] 1 [1, 2, 3, 5]
1 [4, 5] 2 [5]
2 [6, 7, 8] 0 [7, 8, 9]
3 [9, 10, 11, 12, 13, 14] 1 [9, 12, 14, 15]
4 [15, 16, 17] 0 [16, 17, 18]
5 [18, 19] 3 [19, 20]
推荐阅读
- regex - 如何跳过字符正则表达式
- azure-data-explorer - Kusto 查询 - 如何获取当月的开始日期时间
- gremlin - Gremlin 将属性转换为日期并以天为单位计算差异
- python - 验证准确度 (val_acc) 不会随时期变化
- linux - 'strace vim/nano' (Ubuntu)
- sql-server - Azure CICD:PowerShell 脚本任务失败
- python - 如何在 Mystic 中以函数形式指定多个约束?
- python - 在二叉搜索树中搜索
- javascript - Array.find() 或 Array.some() 但返回自定义值
- javascript - three.js - 导入的对象,但看不到任何材料