按星期几对数据进行分类 Python
Categorize Data by Day of Week Python
给定列表列表 Python 2.7:
[['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]
一般情况下如何打印列表的平均值;然后根据星期几取平均值。例如:
2.5, 6.5, 10.5, 9, 1.5, 4.5, 7.5, 5, 2, 4, 6, 8
其中:
1.5、4.5、7.5、5 是上面产生的平均值,因为星期二在此列表中出现两次
2.5, 6.5, 10.5, 9 是榜单的总体平均分
那么2、4、6、8就是星期四出现次数的平均值
我很确定我可以使用 zip() 函数来获取所有类似的值。我只是不确定一周中每天计算的平均值(星期一、星期二、星期三...)
我如何将其组织成具有 "Averages" 和 "Monday, Tuesday,.." 以及其他 headers
的简洁表格格式
Averages Monday Tuesday Wednesday Thursday Friday Saturday Sunday
2.5 6.5 10.5 9 0 1.5 4.5 7.5 5 0 2 4 6 8 0 0 0
我应该使用 if 语句吗?
这对 pandas
来说似乎是一份出色的工作:
from __future__ import print_function
import pandas as pd
import numpy as np
raw_data = [['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]
pandas_data = pd.DataFrame(raw_data, columns=['Date', 'A', 'B', 'C', 'D'])
pandas_data["Date"] = pd.to_datetime(pandas_data["Date"])
print(pandas_data)
print(pandas_data.mean())
输出:
Date A B C D
0 2015-10-27 2 4 6 8
1 2015-11-03 1 5 9 2
2 2015-11-05 2 4 6 8
A 1.666667
B 4.333333
C 7.000000
D 6.000000
这为我们提供了所有列的汇总统计信息,但对于一周中的特定几天,我会做这样的事情(遵循上述代码):
pandas_data["Day of the Week"] = pandas_data["Date"].dt.dayofweek
grouped_data = pandas_data.groupby('Day of the Week').aggregate(np.mean)
print(grouped_data)
输出:
A B C D
Day of the Week
1 1.5 4.5 7.5 5
3 2.0 4.0 6.0 8
pandas
' 星期几的惯例是周一=0,周日=6
pandas
' groupby
函数按照它在罐子上所说的那样做:它根据一些标准对数据进行分组,在本例中是 'Day of the Week' 列。 aggregate
函数然后在这些组上运行给定的函数并为您提供结果。
你可以使用 itertools.groupby
:
from itertools import groupby
import datetime
l = [['OCT 27, 2015', 2, 4, 6, 8],
['NOV 03, 2015', 1, 5, 9, 2],
['NOV 05, 2015', 2, 4, 6, 8]]
# Day of week as number. Monday == 0 ... Sunday == 6
def day_of_week(str_date):
return datetime.datetime.strptime(str_date, '%b %d, %Y').weekday()
stats = [None] * 7
for key, group in groupby(l, key=lambda x: day_of_week(x[0])):
z = zip(*group)
next(z) # skip dates
stats[key] = [sum(i) / len(i) for i in z]
print(stats)
输出:
[None, [1.5, 4.5, 7.5, 5.0], None, [2.0, 4.0, 6.0, 8.0], None, None, None]
给定列表列表 Python 2.7:
[['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]
一般情况下如何打印列表的平均值;然后根据星期几取平均值。例如:
2.5, 6.5, 10.5, 9, 1.5, 4.5, 7.5, 5, 2, 4, 6, 8
其中:
1.5、4.5、7.5、5 是上面产生的平均值,因为星期二在此列表中出现两次
2.5, 6.5, 10.5, 9 是榜单的总体平均分
那么2、4、6、8就是星期四出现次数的平均值
我很确定我可以使用 zip() 函数来获取所有类似的值。我只是不确定一周中每天计算的平均值(星期一、星期二、星期三...)
我如何将其组织成具有 "Averages" 和 "Monday, Tuesday,.." 以及其他 headers
的简洁表格格式 Averages Monday Tuesday Wednesday Thursday Friday Saturday Sunday
2.5 6.5 10.5 9 0 1.5 4.5 7.5 5 0 2 4 6 8 0 0 0
我应该使用 if 语句吗?
这对 pandas
来说似乎是一份出色的工作:
from __future__ import print_function
import pandas as pd
import numpy as np
raw_data = [['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]
pandas_data = pd.DataFrame(raw_data, columns=['Date', 'A', 'B', 'C', 'D'])
pandas_data["Date"] = pd.to_datetime(pandas_data["Date"])
print(pandas_data)
print(pandas_data.mean())
输出:
Date A B C D
0 2015-10-27 2 4 6 8
1 2015-11-03 1 5 9 2
2 2015-11-05 2 4 6 8
A 1.666667
B 4.333333
C 7.000000
D 6.000000
这为我们提供了所有列的汇总统计信息,但对于一周中的特定几天,我会做这样的事情(遵循上述代码):
pandas_data["Day of the Week"] = pandas_data["Date"].dt.dayofweek
grouped_data = pandas_data.groupby('Day of the Week').aggregate(np.mean)
print(grouped_data)
输出:
A B C D
Day of the Week
1 1.5 4.5 7.5 5
3 2.0 4.0 6.0 8
pandas
' 星期几的惯例是周一=0,周日=6
pandas
' groupby
函数按照它在罐子上所说的那样做:它根据一些标准对数据进行分组,在本例中是 'Day of the Week' 列。 aggregate
函数然后在这些组上运行给定的函数并为您提供结果。
你可以使用 itertools.groupby
:
from itertools import groupby
import datetime
l = [['OCT 27, 2015', 2, 4, 6, 8],
['NOV 03, 2015', 1, 5, 9, 2],
['NOV 05, 2015', 2, 4, 6, 8]]
# Day of week as number. Monday == 0 ... Sunday == 6
def day_of_week(str_date):
return datetime.datetime.strptime(str_date, '%b %d, %Y').weekday()
stats = [None] * 7
for key, group in groupby(l, key=lambda x: day_of_week(x[0])):
z = zip(*group)
next(z) # skip dates
stats[key] = [sum(i) / len(i) for i in z]
print(stats)
输出:
[None, [1.5, 4.5, 7.5, 5.0], None, [2.0, 4.0, 6.0, 8.0], None, None, None]