如何从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的位置。这真的解决了你所面临的困难吗?默认熊猫,然后,最重要的是,不详细说明是没有帮助的人挣扎。