如何根据Python中的条件(将Excel计算转移到Python)对不同列中的值进行排名?

时间:2015-05-16 20:34:24

标签: python excel rank

我在Excel中有一个带有大量计算的工作簿,但是文件太大而且计算花了很长时间才能在Excel中完成所以我试图将文件移动到另一个程序(最好是Python)来处理计算。我只有Python的基本经验,所以我甚至不确定这是否是处理这种计算的最佳软件。

无论如何,下面是我正在使用的表(这是实际表的较小版本;实际表有超过35,000行)。



State	Item #	Val1	Val2	Val3	Val4	Val5	Rank1	Rank2	Rank3	Rank4	Rank5	Count
CA  	1    	5.55	4.16	3.12	2.34	1.76	2    	5    	8    	11    	14    	2
CA  	2    	6.43	4.82	3.62	2.71	2.03	1    	3    	6    	9	    12    	2
CA  	3    	4.79	3.59	2.69	2.02	1.52	4    	7    	10    	13	    15    	1
FL  	4    	10.41	7.81	5.86	4.39	3.29	1    	3    	5    	7	    9    	3
FL  	5    	8.02	6.02	4.51	3.38	2.54	2    	4    	6    	8	    11    	2
FL  	6    	3.22	2.42	1.81	1.36	1.02	10    	12    	13    	14    	15    	0
NY  	7    	0.97	0.73	0.55	0.41	0.31	8    	10    	12    	14    	15    	0
NY  	8    	1.44	1.08	0.81	0.61	0.46	6    	7    	9    	11	    13    	0
NY  	9    	14.31	10.73	8.05	6.04	4.53	1    	2    	3    	4	    5	    5
WA  	10    	9.31	6.98	5.24	3.93	2.95	1    	3    	5    	7	    9	    3
WA  	11    	8.91	6.68	5.01	3.76	2.82	2    	4    	6    	8	    10    	2
WA  	12    	1.55	1.16	0.87	0.65	0.49	11    	12    	13    	14    	15	    0




列State,Item#,Val1,Val2,Val3,Val4和Val5是我的输入数据。我需要做的是找到每个州的前5个值,并计算每个项目#的前5个值中有多少个。我在Rank1-Rank5和Count列中完成了Excel中的计算。我想知道这是否可以用Python完成,如果可以,怎么做?我还希望代码是灵活的,以允许我添加更多" Val"列(可能最多10个值)。

谢谢!

2 个答案:

答案 0 :(得分:0)

Pandas可能是执行此类任务的最佳工具。开始here。有许多关于它的在线教程和YouTube视频。例如,this由原作者本人提供。

答案 1 :(得分:0)

通常在使用Python中的表格数据时,pandas库是一个很好的工具。有很多方法可以做你想要的,IIUC,但这里不应该太难以遵循。这主要是为了让您了解您可以做的事情。从看起来像你的DataFrame开始:

>>> df
   State  Item #   Val1   Val2  Val3  Val4  Val5
0     CA       1   5.55   4.16  3.12  2.34  1.76
1     CA       2   6.43   4.82  3.62  2.71  2.03
2     CA       3   4.79   3.59  2.69  2.02  1.52
3     FL       4  10.41   7.81  5.86  4.39  3.29
4     FL       5   8.02   6.02  4.51  3.38  2.54
5     FL       6   3.22   2.42  1.81  1.36  1.02
6     NY       7   0.97   0.73  0.55  0.41  0.31
7     NY       8   1.44   1.08  0.81  0.61  0.46
8     NY       9  14.31  10.73  8.05  6.04  4.53
9     WA      10   9.31   6.98  5.24  3.93  2.95
10    WA      11   8.91   6.68  5.01  3.76  2.82
11    WA      12   1.55   1.16  0.87  0.65  0.49

我们可以(1)将其转为所有数据都是垂直的,(2)对它们进行排名,以便较低的数字与最高得分相关联(有很多选项可以处理关系;我忽略了这些问题) ,(3)决定我们感兴趣的是哪些,以及(4)按州/项目#组合计算它们。 (原则上我猜一个项目可能属于多个州,在这种情况下,我们只是将状态从最后一个组中删除。)

df_m = pd.melt(df, id_vars=["State", "Item #"], var_name="Value")
df_m["rank"] = df_m.groupby("State")["value"].rank(ascending=False)
df_m["top"] = rank <= 5
df_m.groupby(["State", "Item #"], as_index=False)["top"].sum()

最终产生

   State  Item #  top
0     CA       1    2
1     CA       2    2
2     CA       3    1
3     FL       4    3
4     FL       5    2
5     FL       6    0
6     NY       7    0
7     NY       8    0
8     NY       9    5
9     WA      10    3
10    WA      11    2
11    WA      12    0

这只是一种融化(一种枢转操作);一个小组;等级;一个对比;另一个群体;和一个总和(真== 1,所以总和布尔值是一个计数)。对于一个完整的初学者来说可能有点吓人,但希望它会鼓励你尝试一下熊猫,因为只需要一点经验就可以非常有效地完成大量的操作。