根据其他列查找列值的总和

时间:2016-02-23 11:44:12

标签: python-2.7

我有一个像这样的输入文件:

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. 的总和
  3. 同样,对于 Column2 的每个唯一值,我需要找出 column7
  4. 的总和

    1的输出应该是:

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

    2的输出应该是:

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

    我在python中相当新。有人可以告诉我如何实现上述目标?

3 个答案:

答案 0 :(得分: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

您也可以使用自己的名称作为列。与c1c2,... 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

答案 1 :(得分:0)

这可以使用Python的Countercsv库完成,如下所示:

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值作为键将其添加到计数器。结果是两个词典保存每个键的总计数。

答案 2 :(得分:0)

所以不应该是代码编写服务,但我有几分钟。 :)没有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}

您的预期结果似乎与迈克的答案和我使用您的规范得到的数学相匹配。我仔细检查一下。