【问题标题】:Groupby two columns ignoring order of pairsGroupby 两列忽略对的顺序
【发布时间】:2019-05-08 19:37:45
【问题描述】:

假设我们有一个如下所示的数据框:

    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 dataframe group-by pandas-groupby


    【解决方案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]]
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-13
        • 2012-05-29
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 2015-10-30
        相关资源
        最近更新 更多