大熊猫将累积的Z分数映射到数据帧

时间:2014-08-12 16:20:53

标签: python pandas python-2.x

我有一个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

1 个答案:

答案 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

这将修改您传递给它的数据帧。您可以在函数中创建副本,并对其进行修改,然后如果您不想修改原始文件,则将修改后的数据框作为返回值传递。