如何在Python中对结构中的元素进行分组、计数和求和?

如何在Python中对结构中的元素进行分组、计数和求和?,python,python-3.x,data-structures,Python,Python 3.x,Data Structures,这可能是一个简单的问题。我正在读取包含两列的csv文件:名称+值。我可以在那里有很多条目。计算每个“名称”+值总和出现次数的最简单、最有效的方法是什么?我可以通过循环自己完成,但Python中可能有一些聪明的方法来实现这一点 例如: adam;10000 巴特克;1000 托马斯兹;5000 亚当;1000 巴特克;3000 结果: adam;11000;2. 托马斯兹;5000;1. 巴特克;4000;2. Python中处理数据最流行的包之一是Pandas。它允许您将csv数据(通过rea

这可能是一个简单的问题。我正在读取包含两列的csv文件:名称+值。我可以在那里有很多条目。计算每个“名称”+值总和出现次数的最简单、最有效的方法是什么?我可以通过循环自己完成,但Python中可能有一些聪明的方法来实现这一点

例如:

adam;10000
巴特克;1000
托马斯兹;5000
亚当;1000
巴特克;3000
结果:

adam;11000;2.
托马斯兹;5000;1.
巴特克;4000;2.

Python中处理数据最流行的包之一是Pandas。它允许您将csv数据(通过read_csv函数)存储到python对象(称为Pandas Dataframe)中,然后对其应用多个函数

一旦将数据放在数据框上(称之为
df
),就可以执行以下操作

df_result = df.groupby('name')['value'].sum().reset_index()
执行此操作时,您可以按名称重新组合数据,并计算每个同名值的总和。

您可以利用此模块进行此操作。将文件中的数据读入字典-使用名称作为键,并将值存储在此键下的列表中。使用最简单的方法是:

写入数据文件:

name = "f.txt"
with open(name, "w") as f:
    f.write("""adam;10000
bartek;1000
tomasz;5000
adam;1000
bartek;3000""" )
import csv # https://docs.python.org/3/library/csv.html
from collections import defaultdict

# read data into dictionary
results = defaultdict(list)
with open(name, newline='') as f:
  reader = csv.reader(f, delimiter=";")
  for line in reader:
      if line:
          results[line[0]].append(int(line[1]))

print(results)

# write data from dictionary to file
with open("new" + name, "w", newline="") as f:
    writer = csv.writer(f, delimiter=";")
    for key in results:
        writer.writerow([key, sum(results[key]), len(results[key])])


# read file and print it
print(open("new"+name).read())
过程数据文件:

name = "f.txt"
with open(name, "w") as f:
    f.write("""adam;10000
bartek;1000
tomasz;5000
adam;1000
bartek;3000""" )
import csv # https://docs.python.org/3/library/csv.html
from collections import defaultdict

# read data into dictionary
results = defaultdict(list)
with open(name, newline='') as f:
  reader = csv.reader(f, delimiter=";")
  for line in reader:
      if line:
          results[line[0]].append(int(line[1]))

print(results)

# write data from dictionary to file
with open("new" + name, "w", newline="") as f:
    writer = csv.writer(f, delimiter=";")
    for key in results:
        writer.writerow([key, sum(results[key]), len(results[key])])


# read file and print it
print(open("new"+name).read())
输出:

# read data
defaultdict(<class 'list'>, {'adam': [10000, 1000], 
                             'bartek': [1000, 3000], 
                             'tomasz': [5000]})

# written results
adam;11000;2
bartek;4000;2
tomasz;5000;1
#读取数据
defaultdict(,{'adam':[10000,1000],
“巴特克”:[10003000],
‘tomasz’:[5000]})
#书面结果
亚当;11000;2.
巴特克;4000;2.
托马斯兹;5000;1.

假设您的数据位于元组列表中(并且您不/不能使用熊猫),您可以执行以下操作:

people = [('adam', 10000), ('bartek', 1000),
          ('tomasz', 5000), ('adam', 1000), ('bartek', 3000)]

report = {}
for person in people:
    name, salary = person

    # we initialize the counter
    if name not in report:
        report[name] = {'salary': 0, 'times': 0}

    # then we add to it
    report[name]['salary'] = report[name]['salary'] + salary
    report[name]['times'] += 1
然后,您可以使用以下方法检索每个值:

print(report)
print(report['adam'])
print(report['adam']['salary'])
print(report['adam']['times'])

与使用
defaultdict(list)
results[line[0]].append(int(line[1])
然后对结果调用
sum()
不同,我建议直接使用
defaultdict(int)
results[line[0]+=int(line[1])
@stef-输出包含值的总和和求和值的数量,
adam;11000;2
因此是defaultdict(列表)-否则我需要另一个dict来计算行数。