【问题标题】:How to add data of a row to another row when two rows have the same first value当两行具有相同的第一个值时如何将一行的数据添加到另一行
【发布时间】:2018-11-12 10:05:12
【问题描述】:

我有这样的数组:

array = [['page', 'pageviews'],
         ['page1', '65'],
         ['page2', '44'],
         ['page1', '40']]

如何使脚本遍历行并使用“page1”制作一行并将两个值“65”和“40”相加。

【问题讨论】:

  • 您愿意使用pandas吗?
  • 是的,我愿意使用 Pandas,我已经安装了它,但还没有深入研究。

标签: python python-3.x list pandas


【解决方案1】:

使用 pandas(你说你愿意在 cmets 中使用它),这变得非常简单:

import pandas as pd

df = pd.DataFrame(array[1:], columns=array[0])
df['pageviews'] = pd.to_numeric(df.pageviews)
summed = df.groupby('page').pageviews.sum()

这会产生以下 Pandas 系列:

page
page1    105
page2     44

您可以使用页面名称轻松索引:

summed['page1']
# 105

【讨论】:

    【解决方案2】:

    这是使用pandas的解决方案:

    import pandas as pd
    
    # read list of lists into pandas dataframe
    df = pd.DataFrame(array[1:], columns=array[0])
    
    # convert views from string to integer
    df['pageviews'] = df['pageviews'].astype(int)
    
    # group by page, sum pageviews, create list from results
    lst = df.groupby('page')['pageviews'].sum()\
            .reset_index().values.tolist()
    
    # add headers
    res = [array[0]] + lst
    
    print(res)
    
    [['page', 'pageviews'],
     ['page1', 105],
     ['page2', 44]]
    

    【讨论】:

    • 感谢您的回答。我应用了它并且它起作用了。我需要求和然后排序,所以我做了'new_data = df.groupby(0).sum().sort_values(by=[1], ascending=False)'
    【解决方案3】:

    本质上,这是一个分组问题。使用defaultdict 可以轻松分组:

    from collections import defaultdict
    
    sums = defaultdict(int)
    for page, views in array[1:]:
        sums[page] += int(views)
    
    # result: defaultdict(<class 'int'>, {'page1': 105, 'page2': 44})
    

    如果您希望结果与您输入的格式相同(列表列表),请将 dict 转换为带有 list comprehension 的列表:

    result = [[page, views] for page, views in sums.items()]
    # result: [['page1', 105], ['page2', 44]]
    

    【讨论】:

      【解决方案4】:

      你需要排序,之后你可以使用itertools.groupby

      from itertools import groupby
      
      array = [ 
          ['page', 'pageviews'],
          ['page1', '65'],
          ['page2', '44'],
          ['page1', '40']
      ]
      
      # sort it on the first element of each item
      array = sorted(array, key = lambda x: x[0])
      
      # keys of interest
      keys = ['page1', 'page2']
      
      for k, v in groupby(array, key = lambda x: x[0]):
          if k in keys:
              s = sum([int(x[1]) for x in v])
              print("Key: {}, Sum: {}".format(k, s))
      

      这会产生

      Key: page1, Sum: 105
      Key: page2, Sum: 44
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        相关资源
        最近更新 更多