Skip to main content
 首页 » 编程设计

python之如何从 Python 中的文本文件计算中位数

2025年05月04日20wuhuacong

我有这个文本文件:

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 ,然后我们得到整列的中位数