Pandas DataFrame:如何获取列平均值但仅考虑索引低于我想要获取平均值的行

Posted

技术标签:

【中文标题】Pandas DataFrame:如何获取列平均值但仅考虑索引低于我想要获取平均值的行【英文标题】:Pandas DataFrame: how to get column mean valuebut taking into account only the rows that have lower index than the one I want to get the mean 【发布时间】:2019-02-01 20:39:52 【问题描述】:

我的问题是我想预测一支球队对另一支球队的胜利,为此我希望在每场比赛中获得每支球队在比赛日期之前的胜率。

但是,使用df.groupBy("teamName").agg("isVictory":"mean") 为我提供了无法使用的团队的全局信息,因为此时您不应该知道所有比赛的胜率。

所以我想要的是在这场比赛之前获得比赛的胜率,因为我知道我的 DataFrame 中有一个列 index 来保持比赛的顺序(即,如果比赛的索引较低比当前匹配的索引意味着之前已经进行过匹配,因此应该平均考虑这个匹配)

请注意,我的专栏是:

indexMatch, nameTeam, isVictoryTeam

(isVictoryTeam= 如果 Team1 获胜,如果 Team 失败则为 0)

数据集示例:

   IndexMatch  isVictoryTeam team   winrate
0           1              1    a       NaN
1           2              0    a         1
2           3              1    a       0.5
3           4              1    a    0.6667

胜率是预期的输出。 提前感谢您的帮助。

【问题讨论】:

您能否提供一个数据框示例以及所需的输出? 【参考方案1】:

一定有更好的方法,但这个方法有效:

df = pd.DataFrame('team': [' a', ' a', ' a', ' a', 'b', 'b', 'c'],
                   'IndexMatch': [1, 2, 3, 4, 5, 6, 7],
                   'isVictoryTeam': [1, 0, 1, 1, 0, 1, 1])
df['winrate'] = df.groupby('team')['isVictoryTeam'].expanding().mean().reset_index().groupby('team')['isVictoryTeam'].shift().reset_index(drop=True)
df
#   IndexMatch  isVictoryTeam team   winrate
#0           1              1    a       NaN
#1           2              0    a  1.000000
#2           3              1    a  0.500000
#3           4              1    a  0.666667
#4           5              0    b       NaN
#5           6              1    b  0.000000
#6           7              1    c       NaN

【讨论】:

谢谢,这正是我想要的!

以上是关于Pandas DataFrame:如何获取列平均值但仅考虑索引低于我想要获取平均值的行的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中获取每个分区的每列平均值 [重复]

使用 pandas/dataframe 基于 2 列计算加权平均值

计算 Pandas 数据框中的平均真实范围列 [重复]

pandas使用ewm函数计算dataframe指定数据列的的特定周期指数移动(滚动)平均(Exponential Moving Average)

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

pandas使用to_datetime函数将字符串时间数据列转化为时间对象数据列计算dataframe结束时间列和起始时间列的时间差并计算时间差的均值