熊猫-通过迭代过滤器计算平均值

时间:2018-08-07 21:06:29

标签: python pandas numpy

我有一个具有以下结构的数据框

Goals   Team       Day
1     Madrid     monday  
3     Madrid     friday
3     Man U      monday
2     Man u      sunday
etc    etc       etc

所以我有一个包含数百个团队,一周中的几天和目标的数据的数据框。

我想做的是创建一个数据框,其中包含团队和日期之间每种可能组合的平均值,例如:

Team     Day     Average
Madrid   monday    5.6
Madrid   tuesday   6.7
Madrid   tuesday   4.3
Madrid   wednesday 3.5
Madrid   thursday  4.3
Madrid   friday    3.9
Madrid   saturday  9.8
Madrid   sunday    3.4
Man U    monday    4.5
Man U    tuesday   4.2
...       ...      ...
etc       etc      etc

如何使用pandas和numpy做到这一点?

我想我必须使用循环,但是我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

设置

np.random.seed([3, 1415])

teams = ['Madrid', 'Man U']
days = 'mon tue wed thu fri sat sun'.split()
df = pd.DataFrame(dict(
    Team=np.random.choice(teams, 15),
    Day=np.random.choice(days, 15),
    Goals=np.random.randint(10, size=15)
))

groupby

df.groupby(
    ['Team', 'Day'], 
    as_index=False
).mean().rename(columns=dict(Goals='Average'))

     Team  Day  Average
0  Madrid  fri     8.00
1  Madrid  mon     3.75
2   Man U  mon     7.00
3   Man U  sat     5.00
4   Man U  sun     5.00
5   Man U  thu     7.00
6   Man U  tue     8.00
7   Man U  wed     4.00

说明

  1. 我希望groupby能自我解释
  2. as_index=False告诉groupby不要将分组的列放入结果的索引中。它使我不必去reset_index
  3. mean()取平均值
  4. rename(columns=dict(Goals='Average'))只是为了获得所需的列名而做的整理工作。我将字典传递给columns方法的rename参数。

回复评论

  

Pandas如何知道要计算平均值的哪一列?例如,如果我有两列带有数值的列,而我只想取其中一列的平均值,就会发生这种情况。我该如何告诉熊猫?

通过选择groupby

之后的列,您可以更明确地确定要平均的列
df.groupby(
    ['Team', 'Day'], 
    as_index=False
).Goals.mean().rename(columns=dict(Goals='Average'))

否则,Pandas将尝试对所有未分组的列求平均值。