我有一个Pandas Dataframe,其中包含多个联赛和赛季的体育比分和统计数据。
df = pd.DataFrame({'Season' : ['2010', '2010', '2010', '2010', '2011', '2011', '2011', '2011', '2011', '2011'],
'League' : ['A', 'A', 'B', 'A', 'B', 'A', 'A', 'A', 'B', 'B'],
'Date' : [datetime.date(2010, 8, 9), datetime.date(2010, 8, 9), datetime.date(2010, 8, 15), datetime.date(2010, 8, 15), datetime.date(2011, 8, 13),
datetime.date(2011, 8, 14), datetime.date(2011, 9, 1), datetime.date(2011, 9, 1), datetime.date(2011, 9, 4), datetime.date(2011, 9, 7)],
'Team' : ['Bulls', 'Bunnies', 'Bears', 'Bunnies', 'Bulls', 'Dogs', 'Bears', 'Dogs', 'Bears', 'Bunnies'],
'Score' : [75, 95, 65, 81, 83, 77, 67, 49, 82, 68]})
我想将Z分数映射到Dataframe,以获得每个团队的特定统计数据。随着Z分数跟踪球队与联盟内其他球队相比的表现。
这个函数做我想要的并返回一个字典,但我不知道如何将字典映射到数据帧,或者它是最好的方法。
import scipy.stats as ss
def makeCumZScoreMap(ratingType, frame, lg, season, dateObj):
zScoreDict = {}
sampleFrame = frame[(frame.League == lg) & (frame.Season == season) & (frame.Date <= dateObj)]
rating = sampleFrame.groupby(['Team'])[ratingType].mean()
for x, y in dict(pd.Series(ss.zscore(rating, ddof=1), rating.index)).iteritems():
zScoreDict[x] = y
return zScoreDict
这将为“2010-08-09”之前或之前的游戏返回“2010”赛季联赛'A'的数据框列'得分'的Z分数字典。
makeCumZScoreMap('Score', df, 'A', '2010', datetime.date(2010, 8, 9))
这是所需输出的一个例子:
Date League Score Season Team Zscore
0 2010-08-09 A 75 2010 Bulls 0.70
1 2010-08-09 A 95 2010 Bunnies -0.70
2 2010-08-15 B 65 2010 Bears nan
3 2010-08-15 A 81 2010 Bunnies etc.
4 2011-08-13 B 83 2011 Bulls
5 2011-08-14 A 77 2011 Dogs
6 2011-09-01 A 67 2011 Bears
7 2011-09-01 A 49 2011 Dogs
8 2011-09-04 B 82 2011 Bears
9 2011-09-07 B 68 2011 Bunnies
答案 0 :(得分:1)
您可以使用.map
将字典映射到pandas数据框中包含的值。
import scipy.stats as ss
def makeCumZScoreMap(ratingType, frame, lg, season, dateObj):
zScoreDict = {}
sampleFrame = frame[(frame.League == lg) & (frame.Season == season) & (frame.Date <= dateObj)]
rating = sampleFrame.groupby(['Team'])[ratingType].mean()
for x, y in dict(pd.Series(ss.zscore(rating, ddof=1), rating.index)).iteritems():
zScoreDict[x] = y
frame['Zscore'] = frame['Team'].map(zScoreDict)
return frame
这将修改您传递给它的数据帧。您可以在函数中创建副本,并对其进行修改,然后如果您不想修改原始文件,则将修改后的数据框作为返回值传递。