【问题标题】:Pandas making cumulative Z scores map onto dataframe将累积 Z 分数映射到数据框的熊猫
【发布时间】:2014-10-05 19:39:46
【问题描述】:

我有一个 Pandas 数据框,其中包含多个联赛和赛季的运动成绩和统计数据。

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 分数映射到每个团队的特定统计数据帧上。 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”赛季“A”联赛“2010-08-09”或之前的比赛的数据框“得分”列的 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

【问题讨论】:

  • 你如何调用你的函数? (什么是ratingType等等。)
  • ratingType 是我要计算 Z 分数的列,在示例中它是“分数”
  • 但是你能举个例子来说明你是怎么称呼它的吗(即编辑你的问题)? ss 指的是什么?
  • ok ss 是 scipy.stats

标签: python pandas python-2.x


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多