Есть ли способ суммировать все значения в строке в Excel с одним и тем же значением ключа с помощью Pandas Python? - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно сравнить два Excel и сложить все фактические значения, которые имеют одинаковое значение ключа.

example sheet.

sheet 1                  | sheet 2

index  id  count         | index    id   name

  1    a     12          |   1       a     qg1

  2    b     15          |   2       c     ff2

  3    c     21          |   3       f     dv1

  4    b      5          |   4       b     bm5
       .                             .
       .                             .

В приведенном выше случае я ссылаюсь на sheet2 и суммирую фактическое значение (количество) значенийс тем же идентификатором в sheet1. (id a | 100, id b | 20 ...)

Приведенный ниже код занимает слишком много времени, поскольку каждый идентификатор индексируется.

import pandas as pd
import csv


pcode_quantity = pd.read_csv('/1.csv',delimiter=',')

product_info = pd.read_csv('/2.csv' , delimiter=',')

product_list = product_info.id.tolist()

purchase_id = pcode_quantity.id.tolist()

purchase_count = pcode_quantity['count'].tolist()

product_sum = 0

i =0

i2 = 0

product_lenth =len(product_list)

purchase_lenth = len(purchase_id)

dict_pcode = {}

while product_lenth > i:

    while purchase_lenth > i2:
        if product_list[i] == purchase_id[i2]:
            product_sum = product_sum + purchase_count[i2]
        i2=i2+1
    dict_pcode[product_list[i]]=product_sum
    product_sum = 0        
    i2= 0
    i= i+1

sum_pcode = pd.DataFrame(list(dict_pcode.items()))

sum_pcode.to_csv('/output.csv')

Есть лилюбой код, который может ускорить вышеуказанные операции?

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете агрегировать sum по groupby, затем join product_info, отменить возможные пропущенные значения на DataFrame.fillna и, наконец,для словаря используйте set_index с преобразованием в целые числа по astype и последним to_dict:

pcode_quantity = pcode_quantity.groupby('id')['count'].sum()
df = product_info.join(pcode_quantity, on='id').fillna({'count': 0})
print (df)
      id name  count
index               
1      a  qg1   12.0
2      c  ff2   21.0
3      f  dv1    0.0
4      b  bm5   20.0

dict_pcode = df.set_index('id')['count'].astype(int).to_dict()
print (dict_pcode)
{'a': 12, 'c': 21, 'f': 0, 'b': 20}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...