如何从Python中的文本文件计算中值?

如何从Python中的文本文件计算中值?,python,Python,我有这个文本文件: 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

我有这个文本文件:

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
实际文件中没有空格,但如果没有空格,则显示错误。我想计算每个类别的中位数。例如,我想计算Sellerating的中值。到目前为止,我之所以这样做是因为我还需要计算平均值,但我做到了:

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))
我试着这样做: 进口统计 打印统计数据.MediaNavierages 但这是行不通的。 谁能帮帮我,因为我不知道从这里到哪里去? 非常感谢

使用库进行操作,因为所有代码都将减少到几行代码,并且它将允许您访问数据帧中的内容。要了解更多信息,您需要阅读文档,如果您想通过这种方式进行操作,请告诉我

编辑: 这是密码

import pandas as pd
data = pd.read_csv('test.txt', sep=";")
data['sellerRating'].median()
使用库进行操作,因为所有代码都将减少到几行代码,并且它将允许您访问数据帧中的内容。要了解更多信息,您需要阅读文档,如果您想通过这种方式进行操作,请告诉我

编辑: 这是密码

import pandas as pd
data = pd.read_csv('test.txt', sep=";")
data['sellerRating'].median()

要扩展Guarav建议的内容,请使用熊猫:

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)
要解释理解过程中发生的情况:
我们逐列进行,如果需要,将逗号分隔的浮点数转换为点分隔的浮点数应用函数,然后获得整列的中值要扩展Guarav建议的内容,请使用:

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)
要解释理解过程中发生的情况:
我们逐列进行,如果需要,将逗号分隔的浮点数转换为点分隔的浮点数应用函数,然后得到整列的中值运行代码后,我得到以下结果:

raw results:
{'ClosePrice': 0.009999999999999998,
 'Duration': 5.6,
 'OpenPrice': 0.009999999999999998,
 'sellerRating': 3208.8}

Averages:
  sellerRating    3.208,80
  Duration            5,60
  ClosePrice          0,01
  OpenPrice           0,01
这对于平均值来说似乎是正确的,但我相信你需要中间值,这是非常不同的。中位数是中间值,而不是总和。中位数应始终存在于数据集中

相反,您可以在某种数据结构中收集值并找到中间值。一个简单的方法是预先存储所有数据。其思想是解析文件,将数据添加到defaultdict中,并在最后获得中间值

演示:

现在作为中间值是有意义的,因为所有这些值都存在于数据集中


您还可以使用原始数据集对上述结果进行更精确的格式化,但我将由您决定

运行代码后,我得到以下结果:

raw results:
{'ClosePrice': 0.009999999999999998,
 'Duration': 5.6,
 'OpenPrice': 0.009999999999999998,
 'sellerRating': 3208.8}

Averages:
  sellerRating    3.208,80
  Duration            5,60
  ClosePrice          0,01
  OpenPrice           0,01
这对于平均值来说似乎是正确的,但我相信你需要中间值,这是非常不同的。中位数是中间值,而不是总和。中位数应始终存在于数据集中

相反,您可以在某种数据结构中收集值并找到中间值。一个简单的方法是预先存储所有数据。其思想是解析文件,将数据添加到defaultdict中,并在最后获得中间值

演示:

现在作为中间值是有意义的,因为所有这些值都存在于数据集中


您还可以使用原始数据集对上述结果进行更精确的格式化,但我将由您决定

但这不起作用的是没有足够的信息来知道你做错了什么…还有,进口熊猫;df=pandas.read_csv'bijlage.txt',sep=;;你能把结果告诉我吗?pprintaverages@LexBryan结果是:{'ClosePrice':38.84837706511181,'Duration':6.540330417881438,'OpenPrice':14.21424684159374,'Sellerating':3760.90573372206}@JosseLardinois基本上你只想得到这些不同平均值之间的中值,是吗?但这不起作用,因为没有足够的信息来知道你做错了什么……还有,进口熊猫;df=pandas.read_csv'bijlage.txt',sep=;;你能把结果告诉我吗?pprintaverages@LexBryan这就是结果:{'ClosePrice':38.84837706511181,'Duration':6.540330417881438,'OpenPrice':14.21424684159374,'Sellerating':3760.90573372206}@JosseLardinois基本上你只想得到这些不同平均值之间的中位数,对吗?仅仅是图书馆推荐并不能回答这个问题。OP给出了一个示例文件,为什么你没有完成你建议的方法?最后我问他是否需要进一步的帮助添加评论。目前我手头没有笔记本电脑,所以我添加了最后一行,以便他可以在同一线程中获得进一步的帮助。对不起,如果你发现它不完整的答案这是一个不完整的答案,但你不必向我道歉。我在打电话,所以我不能也不会发布答案,因为它无法处理OP发布的代码;想象一下,你处于OP的位置。这真的解决了你所面临的困难吗?默认使用pandas,然后再加上不详细说明,对那些苦苦挣扎的人来说是没有帮助的。仅仅一份图书馆推荐书并不能回答这个问题。OP提供了一个示例文件,为什么
你还没有完成你建议的方法?最后我问他是否需要进一步的帮助添加评论。目前我手头没有笔记本电脑,所以我添加了最后一行,以便他可以在同一线程中获得进一步的帮助。对不起,如果你发现它不完整的答案这是一个不完整的答案,但你不必向我道歉。我在打电话,所以我不能也不会发布答案,因为它无法处理OP发布的代码;想象一下,你处于OP的位置。这真的解决了你所面临的困难吗?默认熊猫,然后,最重要的是,不详细说明是没有帮助的人挣扎。