2016-02-23 5 views
-4

У меня есть входной файл, как это:Найти сумму значений столбца, основываясь на какой-либо другой колонке

j,z,b,bsy,afj,upz,343,13,ruhwd 
u,i,a,dvp,ibt,dxv,154,00,adsif 
t,a,a,jqj,dtd,yxq,540,49,kxthz 
j,z,b,bsy,afj,upz,343,13,ruhwd 
u,i,a,dvp,ibt,dxv,154,00,adsif 
t,a,a,jqj,dtd,yxq,540,49,kxthz 
c,u,g,nfk,ekh,trc,085,83,xppnl 
  1. Для каждого уникального значения COLUMN1, мне нужно, чтобы узнать сумму column7
  2. Аналогично, для каждого уникального значения cOLUMN2, мне нужно, чтобы узнать сумму column7

Выход для 1 должен быть как:

j,686 
u,308 
t,98 
c,83 

Выход для 2 должен быть как:

z,686 
i,308 
a,98 
u,83 

Я довольно новое в питона. Может кто-нибудь, пожалуйста, скажите мне, как я могу достичь вышеуказанного?

+1

Похоже, вы добавляете значения из столбца 7 или столбца 8. Можете ли вы объяснить правило, которое вы используете. –

+0

Может быть, 'itertools.groupby' может помочь. Тем не менее, вам понадобится «сортировка», как предыдущий шаг. – MariusSiuram

ответ

0

Вы можете использовать pandas:

df = pd.read_csv('my_file.csv', header=None) 
print(df.groupby(0)[6].sum()) 
print(df.groupby(1)[6].sum()) 

Выход:

0 
c  85 
j  686 
t 1080 
u  308 
Name: 6, dtype: int64 
1 
a 1080 
i  308 
u  85 
z  686 
Name: 6, dtype: int64 

фрейм данных должен выглядеть следующим образом:

print(df.head()) 

Выход:

0 1 2 3 4 5 6 7  8 
0 j z b bsy afj upz 343 13 ruhwd 
1 u i a dvp ibt dxv 154 0 adsif 
2 t a a jqj dtd yxq 540 49 kxthz 
3 j z b bsy afj upz 343 13 ruhwd 
4 u i a dvp ibt dxv 154 0 adsif 

Вы также можете использовать свои имена для столбцов. Как c1, c2, ... c9:

df = pd.read_csv('my_file.csv', index_col=False, names=['c' + str(x) for x in range(1, 10)]) 
print(df) 

Выход:

c1 c2 c3 c4 c5 c6 c7 c8  c9 
0 j z b bsy afj upz 343 13 ruhwd 
1 u i a dvp ibt dxv 154 0 adsif 
2 t a a jqj dtd yxq 540 49 kxthz 
3 j z b bsy afj upz 343 13 ruhwd 
4 u i a dvp ibt dxv 154 0 adsif 
5 t a a jqj dtd yxq 540 49 kxthz 
6 c u g nfk ekh trc 85 83 xppnl 

Теперь группа по колонке 1 c1 или столбец c2 и подытожить столбец 7 c7:

print(df.groupby(['c1'])['c7'].sum()) 
print(df.groupby(['c2'])['c7'].sum()) 

Выход:

c1 
c  85 
j  686 
t 1080 
u  308 
Name: c7, dtype: int64 
c2 
a 1080 
i  308 
u  85 
z  686 
Name: c7, dtype: int64 
+0

Hi Mike, Ваш код дает мне ошибку ниже: KeyError: 'no item с именем 0' –

+0

Hi Mayank. У вас есть пустые строки в начале вашего файла? Проверьте, как выглядит 'df'. См. Мой отредактированный ответ выше. –

+0

Привет Майк. В файле нет пустых строк. Я вставил свой вывод чуть ниже вашего вывода. В соответствии с тем, что я читал в документах panda, мы должны поместить имя столбца в предложение groupby. Не могли бы вы объяснить, что именно делает 0 и 6 в вашем заявлении groupby? print (df.groupby (0) [6] .sum()) –

0

Это может быть сделано с помощью Counter и csv библиотеки Python, следующим образом:

from collections import Counter 
import csv 

c1 = Counter() 
c2 = Counter() 

with open('input.csv') as f_input: 
    for cols in csv.reader(f_input): 
     col7 = int(cols[6]) 
     c1[cols[0]] += col7 
     c2[cols[1]] += col7 

print "Column 1" 
for value, count in c1.iteritems(): 
    print '{},{}'.format(value, count) 

print "\nColumn 2" 

for value, count in c2.iteritems(): 
    print '{},{}'.format(value, count) 

Давать вам следующий вывод:

Column 1 
c,85 
j,686 
u,308 
t,1080 

Column 2 
i,308 
a,1080 
z,686 
u,85 

Counter является типом словаря Python, который является полезным для подсчета пункты автоматически. c1 содержит все записи в столбце 1 и c2 содержит все записи в столбце 2. Примечание. Списки номеров Python начиная с 0, поэтому первая запись в списке - [0].

Библиотека csv загружает каждую строку файла в список с каждой записью в списке, представляющим другой столбец. Код принимает столбец 7 (т. Е. cols[6]) и преобразует его в целое число, так как все столбцы хранятся в виде строк. Затем он добавляется в счетчик, используя в качестве ключа значение столбца 1 или 2. В результате получается два словаря, содержащих подсчеты для каждого ключа.

+0

Спасибо @Martin Evans. Не могли бы вы рассказать мне, что такое инструкция c1 [cols [0]] + = col7? –

+0

Для каждой строки добавляется текущий счетчик к соответствующему столбцу1 в словаре счетчика. Я улучшил объяснение, надеюсь, сделать это немного яснее. –

0

SO не должно быть услугой написания кода, но у меня было несколько минут. :) Без Pandas вы можете сделать это с помощью CSV-модуля;

import csv 

def sum_to(results, key, add_value): 
    if key not in results: 
     results[key] = 0 

    results[key] += int(add_value) 


column1_results = {} 
column2_results = {} 

with open("input.csv", 'rt') as csvfile: 
    reader = csv.reader(csvfile) 
    for row in reader: 
     sum_to(column1_results, row[0], row[6]) 
     sum_to(column2_results, row[1], row[6]) 


print column1_results 
print column2_results 

Результаты:

{'c': 85, 'j': 686, 'u': 308, 't': 1080} 
{'i': 308, 'a': 1080, 'z': 686, 'u': 85} 

Ваши ожидаемые результаты, кажется, не соответствует математике, что ответ Майка и мой получил с помощью спец. Я бы дважды это проверить.

Смежные вопросы