【问题标题】:Pandas Data Frame add new calculated field using Partitioned Data熊猫数据框使用分区数据添加新的计算字段
【发布时间】:2019-03-15 08:44:05
【问题描述】:

我正在尝试添加一个新的计算字段。我正在尝试Adding calculated column(s) to a dataframe in pandas 中的第二个最佳答案,因为它在我看来似乎是最好的,因为它很整洁。请随时提供更好的选择。

无论哪种方式,我的初始代码如下:

import pandas as pd    

#https://github.com/sivabalanb/Data-Analysis-with-Pandas-and-Python/blob/master/nba.csv
dt_nba = pd.read_csv("data//nba.csv")  

#note this is just basic function.  I want to pass partitioned data like team's average salary
def GetSalaryIncrement(val):
    return val * 1.1

dt_nba["SalaryPlus10Percent"] = map(GetSalaryIncrement,dt_nba["Salary"])

dt_nba[["Name","Team","Salary","SalaryPlus10Percent"]][:5]

然而,结果不是我所期望的:

+----+---------------+----------------+--------------+--------------------------------+
| ID |     Name      |      Team      |    Salary    |      SalaryPlus10Percent       |
+----+---------------+----------------+--------------+--------------------------------+
|  0 | Avery Bradley | Boston Celtics | 7730337.0000 | <map object at 0x7fb819e9b7b8> |
|  1 | Jae Crowder   | Boston Celtics | 6796117.0000 | <map object at 0x7fb819e9b7b8> |
|  2 | John Holland  | Boston Celtics | nan          | <map object at 0x7fb819e9b7b8> |
|  3 | R.J. Hunter   | Boston Celtics | 1148640.0000 | <map object at 0x7fb819e9b7b8> |
|  4 | Jonas Jerebko | Boston Celtics | 5000000.0000 | <map object at 0x7fb819e9b7b8> |
+----+---------------+----------------+--------------+--------------------------------+

我对传递“窗口/聚合数据”特别感兴趣,它应该优雅地忽略 Nan 值。

T-SQL 中的示例我可以这样做:

-- INCREASE EACH PLAYERS SALARY BY 10% OF AVERAGE SALARY OF THE TEAM
SELECT NewSalary= Salary + (.1 * AVG(Salary) OVER (PARTITION BY Team))
FROM nba_data

如果可能的话,我想在 Pandas 中这样做。谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我想你正在寻找

    dt_nba["Salary"]=dt_nba["Salary"].map(GetSalaryIncrement)
    

    你也可以用

    GetSalaryIncrement(dt_nba["Salary"])
    

    dt_nba["Salary"].apply(GetSalaryIncrement) 
    

    到计算INCREASE EACH PLAYERS SALARY BY 10% OF AVERAGE SALARY OF THE TEAM

    dt_nba['Newsa']=dt_nba.groupby('Team')['Salary'].transform('mean')*0.1+dt_nba["Salary"]
    

    【讨论】:

    • @Earl,在这种情况下,Wen_Ben 底部的解决方案将起作用。您的函数只是将每行增加 10%,而不考虑团队的汇总。
    • 如果我隔离平均团队数据,看起来它正在工作,平均值的值不会重复。我还没有做实际的统计。但是,GetSalaryIncrement 公式似乎不起作用。我的功能有误吗? 7730337 的薪水返回 8148487.4857。
    • 对不起忽略我上面的错误。我错过了输入我实际上正在查看的平均团队工资增长的列名。到目前为止,这些数字在功能上匹配。我现在将按值评估该组。
    • 好的,我确认窗口聚合代码工作正常。我检查了波士顿凯尔特人队,它按预期给出了 4181504.857,布鲁克林篮网按预期给出了 3501898.333。 Pandas 看起来是一个非常好的库。感谢 Wen-Bee 和 Efran 的回答和 cmets。
    猜你喜欢
    • 2023-01-27
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2012-09-04
    相关资源
    最近更新 更多