Python按列分组并应用函数。

3

我有一个数据框,看起来像这样,其中包含了2000-2022年所有分区和两个联盟的数据。

Tm        Conference   Division    W-L%.    Year  
Bills         AFC        East      0.813    2022   
Dolphins      AFC        East      0.529    2022  
Patriots      AFC        East      0.471    2022    
Jets          AFC        East      0.412    2022   
Cowboys       NFC        East      0.706    2022   
Giants        NFC        East      0.559    2022   
Eagles        NFC        East      0.824    2022  
Commanders    NFC        East      0.500    2022    

我想按照Team、Conference和year进行分组,并创建一个名为"Division W-L%"的新列,该列找到特定赛区、会议和年份中每个球队的平均W-L%,但不包括正在计算的球队。我知道找到Divison W-L%的公式是: df['Division_W-L%'] = (df['W-L%'].sum() - df['W-L%']) / (len(df) -1)。

这是我希望数据框看起来像的样子。例如,对于"Bills",我们将通过执行(0.529 + 0.471 + 0.412)/3来计算Division W-L%,因为这三个团队处于同一会议、分区和年份。

Tm        Conference   Division    W-L%.    Year  Division W-L%
Bills         AFC        East      0.813    2022    0.470667
Dolphins      AFC        East      0.529    2022    0.565333
Patriots      AFC        East      0.471    2022    0.584667
Jets          AFC        East      0.412    2022    0.604333
Cowboys       NFC        East      0.706    2022    0.627667
Giants        NFC        East      0.559    2022    0.676667
Eagles        NFC        East      0.824    2022    0.588333
Commanders    NFC        East      0.500    2022    0.696333

我尝试按照上述所描述的方式进行操作,即按这三个类别进行分组,然后将该公式应用于 W-L% 列,但是我仍然收到错误提示。非常感谢您的帮助!

2个回答

3
你可以使用transform而不是apply。计算组的总和,然后减去当前行的W-L%,再除以组的大小减1(因为你想排除掉该行本身):
df['Division W-L%'] = (df.groupby(['Conference', 'Division', 'Year'])['W-L%.']
                         .transform(lambda x: (x.sum() - x) / (len(x) - 1)))

输出:

>>> df
           Tm Conference Division  W-L%.  Year  Division W-L%
0       Bills        AFC     East  0.813  2022       0.470667
1    Dolphins        AFC     East  0.529  2022       0.565333
2    Patriots        AFC     East  0.471  2022       0.584667
3        Jets        AFC     East  0.412  2022       0.604333
4     Cowboys        NFC     East  0.706  2022       0.627667
5      Giants        NFC     East  0.559  2022       0.676667
6      Eagles        NFC     East  0.824  2022       0.588333
7  Commanders        NFC     East  0.500  2022       0.696333

2

尝试:

df['Division W-L% NEW'] = df.groupby(['Conference', 'Division', 'Year'])['W-L%.'].transform('sum') - df['W-L%.']
df['Division W-L% NEW'] = df.groupby(['Conference', 'Division', 'Year'])['Division W-L% NEW'].transform(lambda x: x / (len(x)-1))
print(df)

输出:

           Tm Conference Division  W-L%.  Year  Division W-L%  Division W-L% NEW
0       Bills        AFC     East  0.813  2022       0.470667           0.470667
1    Dolphins        AFC     East  0.529  2022       0.565333           0.565333
2    Patriots        AFC     East  0.471  2022       0.584667           0.584667
3        Jets        AFC     East  0.412  2022       0.604333           0.604333
4     Cowboys        NFC     East  0.706  2022       0.627667           0.627667
5      Giants        NFC     East  0.559  2022       0.676667           0.676667
6      Eagles        NFC     East  0.824  2022       0.588333           0.588333
7  Commanders        NFC     East  0.500  2022       0.696333           0.696333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接