我有这个文本文件:
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))
我试过这样做: 进口统计 打印(统计数据。中位数(平均值) 但这是行不通的。 任何人都可以帮助我,因为我不知道从这里去哪里? 非常感谢!!
请您参考如下方法:
要扩展 Guarav 推荐的内容,请使用 pandas:
import pandas as pd
import locale
avg_names = 'sellerRating', 'Duration', 'ClosePrice', 'OpenPrice'
frame = pd.read_csv(open('bijlage.txt'), delimiter=';')
# now you can access columns like a dictionary
frame['sellerRating'].median() # this will give you the median of the entire column
avg = [frame[i].apply(locale.atof).median() if frame[i].dtype == object else frame[i].median() for i in avg_names]
print(avg)
解释理解中发生的事情:
我们逐列进行,如果需要(应用函数),将逗号分隔的 float 转换为点分隔的 float ,然后我们得到整列的中位数
