如何计算CSV文件中字段的模式?

时间:2019-01-03 10:53:07

标签: python statistics

我有这个文本文件:

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/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Music/Movie/Game;US;3249;5;Mon;0,01;0,01;No
Automotive;US;3115;7;Tue;0,01;0,01;No
Automotive;US;3115;7;Tue;0,01;0,01;No
Automotive;US;3115;7;Tue;0,01;0,01;Yes

我想计算每个类别的中位数。因此,例如,我想根据sellerRating计算模式。到目前为止,我已经有了(因为我还需要计算平均值,但是我设法做到了):

import csv
import locale
import statistics
from pprint import pprint, pformat

import locale

locale.setlocale(locale.LC_ALL, 'Dutch_Netherlands.1252')

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


num_values = 0
with open('bijlage.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])


for avg_name, total in averages.items():
    averages[avg_name] = total / num_values

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

print()
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))

我试图做:

from statistics import mode
mode(averages)

但这不起作用,我现在陷入困境。 我是python初学者,所以如果您回答我的问题,可以向我解释一下为什么应该这样,以便我学习。

2 个答案:

答案 0 :(得分:1)

Pandas是一个很好的库。
pip install pandas

import pandas as pd
df = pd.read_csv('bijlage.csv', delimiter=';', decimal=',')  # 'bijlage.txt' in your case
sellerRating_median = df['sellerRating'].median()
print('Seller rating median: {}'.format(sellerRating_median)

median()外,还有mean()用于计算平均值
您还可以使用mode()计算序列的模式,但这会返回一个数字列表,因此您必须使用mode()[0]来获取第一个数字。

答案 1 :(得分:0)

您可以在计算平均值时这样做,它使用defaultdict存储数据以计算每个类别的模式。这在这里很有用,因为它允许创建列表字典而无需知道键将是什么或键会前进多少,此外,它将在第一次访问空{时自动初始化每个键的值{1}}在此处的使用方式(list)。

您也应该使用统计信息模块来计算平均值,而不是自己计算平均值-但我没有改变它,因为这不是您的问题。

defaultdict(list)