如何在我的文本文件中进行分类并计算出数字的平均值?

时间:2018-12-20 10:53:27

标签: python

我正在做作业,但是我被困住了,不知道如何进行。

我需要从第一行(来自txt文件)的不同类别中选择不同的类别,并计算每个数值的平均值。当我在txt文件中添加新行时,该程序必须能够正常运行。

Category;currency;sellerRating;Duration;endDay;ClosePrice;OpenPrice;Competitive?
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Automotive/Game;US;3249;5;Mon;0,01;0,01;No
Music/Automotive/Game;US;3249;5;Mon;0,01;0,01;No

这是文本文件。我试图从中区分出不同的类别,但是我不知道我是否正确地做到了,以及如何让Python知道他必须从1组中计算所有数字。

with open('bijlage2.txt') as bestand:
    maak_er_lists_van = [(line.strip()).split(';') for line in bestand]
keys = maak_er_lists_van[0]
lijst = list(zip([keys]*len(maak_er_lists_van[1:]),
maak_er_lists_van[1:]))
x = [zip(i[0], i[1]) for i in lijst]
maak_dict = [dict(i) for i in x]


for i in maak_dict:
    categorieen =[i['Category'], i['currency'], i['sellerRating'],
i['Duration'], i['endDay'], i['ClosePrice'], i['OpenPrice'],
i['Competitive?']]
    categorieen = list(map(int, categorieen))

这是我到目前为止所拥有的。我是Python初学者,所以整个文本文件对我来说是新的。有人可以帮助我或解释我需要做什么,以便我可以进一步从事该项目吗?提前非常感谢!

2 个答案:

答案 0 :(得分:1)

这就是我要做的。我必须使用locale.atof()进行添加,因为我在.的位置用作小数点,而不是逗号。您可能必须按照指示进行更改。

csv模块用于读取文件,并通过两步过程计算平均值。首先,将每个类别的值相加,然后,根据读取的值的数量计算每个类别的平均值。

import csv
import locale
from pprint import pprint, pformat

import locale
#locale.setlocale(locale.LC_ALL, '')  # empty string for platform's default settings
# Following used for testing to force ',' to be considered as a decimal point.
locale.setlocale(locale.LC_ALL, 'French_France.1252')

avg_names = 'sellerRating', 'Duration', 'ClosePrice', 'OpenPrice'
averages = {avg_name: 0 for avg_name in avg_names}  # Initialze.

# Find total of each category of interest.
num_values = 0
with open('bijlage2.txt', newline='') as bestand:
    csvreader = csv.DictReader(bestand, delimiter=';')
    for row in csvreader:
        num_values += 1
        for avg_name in avg_names:
            averages[avg_name] += locale.atof(row[avg_name])

# Calculate average of each summed value.
for avg_name, total in averages.items():
    averages[avg_name] = total / num_values

print('raw results:')
pprint(averages)

print()  # Formatted output
print('Averages:')
for avg_name in avg_names:
    rounded = locale.format_string('%.2f', round(averages[avg_name], 2),
                                   grouping=True)
    print('  {:<13} {:>10}'.format(avg_name, rounded))

输出:

raw results:
{'ClosePrice': 0.01, 'Duration': 5.0, 'OpenPrice': 0.01, 'sellerRating': 3249.0}

Averages:
  sellerRating    3 249,00
  Duration            5,00
  ClosePrice          0,01
  OpenPrice           0,01

答案 1 :(得分:0)

一切都很好,您可以通过这种方式读取文件并创建包含类别和值的字典imo。您的列表maak_dict每行包含一个字典。要计算一个类别的平均值,您可以执行以下操作:

def calc_average(categ):
    values = [i[categ] for i in maak_dict]
    average = sum(values)/len(values)
    return average

假设您要计算平均值。 categ必须是字符串。

之后,您可以创建一个包含所有平均值的新字典:

new_dict = {}
for category in maak_dict[0].keys():
    avg = calc_average(category)
    new_dict[category] = avg