Как добавить данные строки в другую строку, если две строки имеют одинаковое первое значение - PullRequest
0 голосов
/ 02 июня 2018

У меня есть такой массив:

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

Как сделать так, чтобы скрипт проходил по строкам и составлял одну строку с 'page1' и суммировал два значения '65' и '40' вместе.

Ответы [ 4 ]

0 голосов
/ 02 июня 2018

Вот решение, использующее 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]]
0 голосов
/ 02 июня 2018

Используя панд (вы говорите, что можете использовать это в комментариях), это становится довольно просто:

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()

Это приводит к следующей серии панд:

page
page1    105
page2     44

Который вы можете легко проиндексировать, используя имя страницы:

summed['page1']
# 105
0 голосов
/ 02 июня 2018

По сути, это проблема группировки.Группировать легко с помощью 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]]
0 голосов
/ 02 июня 2018

Вам нужно отсортировать его, после чего вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...