Pandas平均选定的行和列

时间:2015-02-05 13:26:56

标签: python pandas

我正在使用一些EPL统计数据。我有以下格式的一季中所有比赛的csv。

D           H                A           H_SC  A_SC H_ODDS  D_ODDS  A_ODDS...
11.05.2014  Norwich          Arsenal     0     2    5.00    4.00    1.73 
11.05.2014  Chelsea          Swansea     0     0    1.50    3.00    5.00     

我想要做的是每场比赛计算N场前比赛的球队平均数据。结果看起来应该是这样的。

D           H        A        H_SC         A_SC         H_ODDS  D_ODDS  A_ODDS...
11.05.2014  Norwich  Arsenal  avgNorwichSC avgArsenalSC 5.00    4.00    1.73
11.05.2014  Chelsea  Swansea  avgChelseaSC avgSwanseaSC 1.50    3.00    5.00 

因此,日期,球队和赔率保持不变,其他统计数据将替换为之前N场比赛的平均值。编辑:前N轮的比赛不应该在决赛桌中,因为没有足够的数据来计算平均值。

对我来说最棘手的部分是我平均的统计数据具有不同的预置(H_或A_),具体取决于比赛的位置。

我现在设法做的就是创建字典,其中key是俱乐部名称,值是包含俱乐部所有比赛的DataFrame。

D           H        A          H_SC  A_SC  H_ODDS  D_ODDS  A_ODDS...
11.05.2014  Norwich  Arsenal    0     2     5.00    4.00    1.73
04.05.2014  Arsenal  West Brom  1     0     1.40    5.25    8.00 

我以前也没有大熊猫编码,但我对代码不满意,我想学习大熊猫:)。

1 个答案:

答案 0 :(得分:0)

你说你想学习大熊猫,所以我给出了一些例子(用类似数据测试过)来让你走上正确的轨道。这是一个观点,但我认为找到最后的N游戏很难,所以我最初假设/假装你想要在整个桌面上找到平均值。如果发现“最后N”确实是重要的,我可以添加答案。这应该让你和熊猫和gropuby一起去 - 我已经留下了印刷品,所以你可以理解发生了什么。

import pandas

EPL_df = pandas.DataFrame.from_csv('D:\\EPLstats.csv')
#Find most recent date for each team
EPL_df['D'] = pandas.to_datetime(EPL_df['D'])
homeGroup = EPL_df.groupby('H')
awayGroup = EPL_df.groupby('A')

#Following will give you dataframes, team against last game, home and away
homeLastGame = homeGroup['D'].max()
awayLastGame = awayGroup['D'].max()
teamLastGame = pandas.concat([homeLastGame, awayLastGame]).reset_index().groupby('index')['D'].max()
print teamLastGame

homeAveScore = homeGroup['H_SC'].mean()
awayAveScore = awayGroup['A_SC'].mean()
teamAveScore = (homeGroup['H_SC'].sum() + awayGroup['A_SC'].sum()) / (homeGroup['H_SC'].count() + awayGroup['A_SC'].count()) 

print teamAveScore

您现在拥有每支球队的平均得分以及最近的比赛日期。您现在要做的就是使用最近的日期选择原始数据框的相关行(即除了得分列之外的其他内容),然后使用该行中的团队名称从平均得分数据框中进行选择。

e.g。

recentRows = EPL_df.loc[EPL_df['D'] > pandas.to_datetime("2015/01/10")]

print recentRows

def insertAverages(s):
    a = teamAveScore[s['H']] 
    b = teamAveScore[s['A']]
    print a,b
    return pandas.Series(dict(H_AVSC=a, A_AVSC=b))

finalTable = pandas.concat([recentRows, recentRows.apply(insertAverages, axis = 1)], axis=1)

print finalTable

finalTable有最新游戏的原始赔率等,有两个额外的列(H_AVSC和A_AVSC),用于参与这些比赛的主队和客队的平均分数

修改

一堆陷阱

  1. 刚才注意到我没有在to_datetime()中放置格式字符串。对于您的日期 - 它们看起来像英国格式的点,所以你应该做

    EPL_df['D'] = pandas.to_datetime(EPL_df['D'], format='%d.%m.%Y')

  2. 您可以使用teamLastGame中的最短日期,而不是我示例中的硬编码2015/01/10

  3. 如果您确实需要在H_SC中使用H_AVSC替换列finalTable,而不是添加平均值:

    newCols = recentRows.apply(insertAverages, axis = 1)
    recentRows['H_SC'] = newCols['H_AVSC'] recentRows['A_SC'] = newCols['A_AVSC']
    print recentRows