使用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}