提问人:Caerus 提问时间:12/7/2018 最后编辑:cs95Caerus 更新时间:7/5/2021 访问量:1843
Groupby 两列忽略对的顺序
Groupby two columns ignoring order of pairs
问:
假设我们有一个如下所示的 DataFrame:
start stop duration
0 A B 1
1 B A 2
2 C D 2
3 D C 0
构建列表的最佳方法是什么:i) 开始/停止对;ii) 启动/停止对的计数;iii) 启动/停止对的平均持续时间?在这种情况下,顺序应该无关紧要:.(A,B)=(B,A)
期望输出:[[start,stop,count,avg duration]]
在此示例中:[[A,B,2,1.5],[C,D,2,1]]
答:
9赞
cs95
12/7/2018
#1
sort
前两列(您可以就地执行此操作,也可以创建副本并执行相同的操作;我已经完成了前者),然后和:groupby
agg
df[['start', 'stop']] = np.sort(df[['start', 'stop']], axis=1)
(df.groupby(['start','stop'])
.duration
.agg(['count', 'mean'])
.reset_index()
.values
.tolist())
# [['A', 'B', 2, 1.5], ['C', 'D', 2, 1.0]]
0赞
Divyanshu Srivastava
7/5/2021
#2
在一行中,这也可以通过以下方式实现
df.apply(lambda x: x.append(pd.Series(','.join([str(x) for x in sorted(x[['start', 'stop']])]))), axis=1).groupby([0]).duration.agg(['count', 'mean'])
结果:
count mean
0
A,B 2 1.5
C,D 2 1.0
评论