将脚本移至“函数”和“新列”无法正确保留值

时间:2018-12-28 17:34:11

标签: python-3.x pandas

我是新来的,不知道我在做什么。我搜索了Stack Overflow,却找不到我做错了什么。

我要做的是根据一列中的值对数据框进行排序,然后创建一个新列,然后根据排序后的列表分配一个等级(在这种情况下为1到4)。然后根据新列中的值再次进行操作。

例如:     dfteams = dfteams.sort_values([[Wins'],ascending = [False])         dfteams ['Win_rnk'] = range(1,len(dfteams)+ 1)

在我的数据框中(分配了名称“ dfteams”),我已按“胜数”列对整个DF进行了排序。然后,我创建了一个名为“ Win_rnk”的新列,并为每行分配了1到4的排名(因为这是我数据框中有多少行)。

那行得通。而且,如果我根据新的统计数据再次执行此操作,那么它也可以正常运行。

但是,如果我使用相同的代码并将其放入函数中,则所有新列最终都具有相同的值(根据我排序的最后一列进行排名)。而且我不知道为什么它直接作为脚本的一部分,而不是通过函数执行时。

标题=团队,胜利,失败,积分

1、7、1、560队

第2、6、2、595队

3、5、3、403队

4、4、4、460队

我想添加Win_rnk列(带有上面的示例代码): 标头=团队,胜利,失败,积分,Win_rnk

1、7、1、560、1队

Team2,6,2,595,2

3、5、3、403、3队

4、4、4、460、4队

然后,我想添加Points_rnk列(与示例相同的代码,但调用dfteams ['Points']进行排序:

标题=团队,获胜,亏损,积分,Win_rnk,Points_rnk

第2、6、2、595、2、1队

1、7、1、560、1、2队

4、4、4、460、4、3队

第3、5、3、403、3、4队

在我的脚本中,这可行。我想将代码移到一个函数上,但是当我这样做时,我最终使两个新列都具有相同的值。

defrank_stats(dfteams):     dfteams = dfteams.sort_values([[Wins'],ascending = [False])     dfteams ['Win_rnk'] = range(1,len(dfteams)+ 1)

dfteams = dfteams.sort_values(['Points'], ascending=[False])
dfteams['Points_rnk'] = range(1, len(dfteams) + 1)

当我调用函数而不是直接在脚本中运行它时,它会给我以下信息:

标题=团队,获胜,亏损,积分,Win_rnk,Points_rnk

2、6、2、595、1、1队

团队1、7、1、560、2、2

4、4、4、460、3、3队

第3、5、3、403、4、4队

请注意,现在返回的Win_rnk列的值与Points_rnk相同。这不是我想做的。

由于我是编程的新手,可能有些基本的知识我不了解,但是在寻找答案并找不到答案后,我希望有人可以告诉我这是什么。我做错了。

1 个答案:

答案 0 :(得分:0)

实现这样的功能

def ranking_stats(dfteams): 
    dfteams = dfteams.sort_values(['Wins'], ascending=[False])
    dfteams['Win_rnk'] = range(1, len(dfteams) + 1)
    dfteams = dfteams.sort_values(['Points'], ascending=[False])
    dfteams['Points_rnk'] = range(1, len(dfteams) + 1)
    return dfteams

输入数据框-> dfteams

      Team   Wins   Losses  Points
0     Team1   7       1      560
1     Team2   6       2      595
2     Team3   5       3      403
3     Team4   4       4      460

现在,像这样呼叫ranking_stats()

dfteams = ranking_stats(dfteams)
dfteams

输出:

Team    Wins    Losses  Points  Win_rnk Points_rnk
1   Team2   6         2      595      2         1
0   Team1   7         1      560      1         2
3   Team4   4         4      460      4         3
2   Team3   5         3      403      3         4