Groupby 两列忽略对的顺序

Groupby two columns ignoring order of pairs

提问人:Caerus 提问时间:12/7/2018 最后编辑:cs95Caerus 更新时间:7/5/2021 访问量:1843

问:

假设我们有一个如下所示的 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]]

python pandas 数据帧 group-by pandas-groupby

评论


答:

9赞 cs95 12/7/2018 #1

sort前两列(您可以就地执行此操作,也可以创建副本并执行相同的操作;我已经完成了前者),然后和:groupbyagg

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