Groupby two columns ignoring order of pairs

折月煮酒 提交于 2020-01-02 08:21:38

问题


Suppose we have a dataframe that looks like this:

    start   stop   duration
0   A       B      1
1   B       A      2
2   C       D      2
3   D       C      0

What's the best way to construct a list of: i) start/stop pairs; ii) count of start/stop pairs; iii) avg duration of start/stop pairs? In this case, order should not matter: (A,B)=(B,A).

Desired output: [[start,stop,count,avg duration]]

In this example: [[A,B,2,1.5],[C,D,2,1]]


回答1:


sort the first two columns (you can do this in-place, or create a copy and do the same thing; I've done the former), then groupby and 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]]


来源:https://stackoverflow.com/questions/53662717/groupby-two-columns-ignoring-order-of-pairs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!