使用Python计算表上的字符串出现次数

使用Python计算表上的字符串出现次数,python,Python,假设我有一个表,其中有一个名称和一个值,如: NAME VALUE Artur 2 Cristian 3 Artur 4 Peter 5 Cristian 8 Artur 2 我需要隔离名称和值的总和,如: NAME VALUE Artur 8 Cristian 11 Peter 5 我该怎么做 我尝试拆分每一行以隔离值,但我只是不知道如何识别重复的名称 data = open ('data.tx

假设我有一个表,其中有一个名称和一个值,如:

NAME       VALUE
Artur      2
Cristian   3
Artur      4
Peter      5
Cristian   8
Artur      2
我需要隔离名称和值的总和,如:

NAME       VALUE
Artur      8
Cristian   11
Peter      5
我该怎么做

我尝试拆分每一行以隔离值,但我只是不知道如何识别重复的名称

data = open ('data.txt', 'r')

for line in data:
    value = line.split()

我需要将重复的名称分组并求和它们的值。

首先,您需要使用read\u csv as读取此数据

data = pd.read_csv('data.txt')
它会自动将数据更改为数据帧格式

如果它已经是数据帧格式,您可以使用pivot_table

df = pd.pivot_table(data, index = 'NAME', values='VALUE', aggfunc='sum').reset_index()

您可以创建一个dict,在第一次遇到该名称时将其添加,否则将其值相加。您只需正常读取文件,不要忘记
strip
它和
split
,默认情况下按空格分隔字符串。查看此代码:

res = {}
with open("data.txt", "r") as f:
  # Read file skipping the header
  for line in f.readlines()[1:]:
    name, value = line.strip().split()
    if name not in res:
      res[name] = int(value)
      continue
    res[name] += int(value)
print(res)
印刷品

{'Artur': 8, 'Cristian': 11, 'Peter': 5}
如果要创建具有结果的新文件:

with open("new_data.txt", "w") as f:
  f.write("{: <11}VALUE\n".format("NAME"))
  for name, value in res.items():
    f.write("{: <11}{}\n".format(name, value))
打开(“new_data.txt”,“w”)作为f:

f、 如果
data.txt
包含以下文本,请写入(“{::

NAME       VALUE
Artur      2
Cristian   3
Artur      4
Peter      5
Cristian   8
Artur      2
然后这个脚本:

with open('data.txt', 'r') as f_in:
    next(f_in) # skip headers
    data  = []
    for line in f_in:
        data.append(line.split())

items = {}
for name, value in data:
    items[name] = items.get(name, 0) + int(value)

print('{: <10}{}'.format('NAME', 'VALUE'))
for name, value in items.items():
    print('{: <10}{}'.format(name, value))
使用非常强大的工具:

data=pd.read_csv(fname,sep=“\s+\t+\s+\t+\t+\t+\s+”)
by_name_df=data.groupby(by=“name”).sum()
打印(按名称打印)
第一行将csv读入一个数据帧,并带有连续的分隔符(如果您有任何空格和连续的空格)。 第二行按
NAME
列分组并求和,生成按名称求和的输出数据帧

如果希望名称保留为列,而不是新数据帧中索引的一部分,请使用以下命令:

by_name_df=data.groupby(by=“name”,as_index=False).sum()
生成的输出:

名称值
阿图尔8
克里斯蒂安11
彼得5
您可以这样做:

data=open('data.txt','r')
求和={}
对于行输入数据:
value=line.split()
如果值[0]=“NAME”:
持续
如果值[0]未求和:
求和[值[0]]=int(值[1])
其他:
求和[值[0]]+=int(值[1])
打印“名称\t值”
对于k,v在summated.iteritems()中:
打印“%s\t%s”%(k,v)
产出:

Name    Value
Cristian    11
Peter   5
Artur   8

可以使用字典将名称另存为键,将值另存为值

data = open('data.txt', 'r')
# skip first line
first_line = data.readline()

name_dict = {}
for line in data:
    value = line.split()

    k = value[0]
    v = int(value[1])
    if k in name_dict:
        name_dict[k] += v
    else:
        name_dict[k] = v

print(name_dict)
将存储值命名为:

{'Artur': 8, 'Cristian': 11, 'Peter': 5}

你比我快了10秒当你有整个库为你解析每一行的时候,为什么还要费劲呢you@Zionsof你可以使用任何你想要的库,但也许你根本不想,或者你不想管理需求,或者只为一个功能导入整个库?这是一个解决方案,有多个。虽然你在技术上正确,我的观点是,对一次性问题给出解决方案在我看来是一种糟糕的做法。你可能希望有一个适用于多个函数的通用解决方案。第二天,他将添加一列,整个解析需要更改。@Zionsof这是由OP决定的,对于这个特定的问题,没有上下文,可能只是一个简短的脚本,wh谁知道呢。
data = open('data.txt', 'r')
# skip first line
first_line = data.readline()

name_dict = {}
for line in data:
    value = line.split()

    k = value[0]
    v = int(value[1])
    if k in name_dict:
        name_dict[k] += v
    else:
        name_dict[k] = v

print(name_dict)
{'Artur': 8, 'Cristian': 11, 'Peter': 5}