【问题标题】:Build a Dict of Means from Pandas从 Pandas 构建一个均值字典
【发布时间】:2018-12-06 02:17:52
【问题描述】:

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

    start   stop   duration
0   1       2      1
1   3       4      2
2   2       1      2
3   4       3      0

我正在尝试使用 key= (start, stop) 对和 value= 平均它们的持续时间来构建字典,无论顺序如何。换句话说,(1,2) 和 (2,1) 都将被视为一对 (1,2) 的出现。

所需输出:dict_avg= {(1,2):1.5, (3,4):1}

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    这是一种可能的方法,即采用已排序对的元组:

    >>> grp = df[['start', 'stop']].apply(lambda x: tuple(sorted(x)), axis=1)
    >>> df.groupby(grp)['duration'].mean().to_dict()
    {(1, 2): 1.5, (3, 4): 1.0}
    

    作为免责声明,我几乎可以保证这将比此处给出的 NumPy-sort 慢得多,因为在 .apply() 中使用 lambda(并且需要使用 sorted() + tuple() 构造函数)需要每个在 Python 空间中调用,而不是像理想情况下通过 Pandas/NumPy 那样在 Cython/C 中完成。

    【讨论】:

      【解决方案2】:

      使用frozenset 不是快速但简洁,如果您正在寻找有效的方式检查link

      df.groupby(df[['start','stop']].apply(frozenset,1).map(tuple)).duration.mean().to_dict()
      Out[1048]: {(1, 2): 1.5, (3, 4): 1.0}
      

      【讨论】:

        【解决方案3】:

        这也是一种方式:

        # sort data based on first two columns
        df.iloc[:,:2].values.sort()
        
        # create the dict of mean
        df.groupby(['start','stop'])['duration'].mean().to_dict()
        
        {(1, 2): 1.5, (3, 4): 1.0}
        

        【讨论】:

          【解决方案4】:

          defaultdict

          from collections import defaultdict
          
          m = defaultdict(list)
          
          for *t, d in zip(*map(df.get, df)):
              m[tuple({*t})].append(d)
          
          {k: sum(v) / len(v) for k, v in m.items()}
          
          {(1, 2): 1.5, (3, 4): 1.0}
          

          【讨论】:

            猜你喜欢
            • 2016-02-14
            • 2022-09-28
            • 2017-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-30
            • 1970-01-01
            • 2018-06-21
            相关资源
            最近更新 更多