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

How to rank values in different columns based on a criteria in Python (transferring Excel calculations to Python)?

我在 Excel 中有一个包含大量计算的工作簿,但是文件变得太大,并且计算需要很长时间才能在 Excel 中完成,所以我正在尝试移动文件到另一个程序(最好是 Python)来处理计算。我只有 Python 的基本经验,所以我什至不确定这是否是处理此计算的最佳软件。

无论如何,下面是我正在使用的 table(这是实际 table 的较小版本;实际 table 有超过 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 个值。我已经在 Excel 中的 Rank1-Rank5 和 Count 列中进行了计算。我想知道这是否可以在 Python 中完成,如果可以,怎么做?我还希望代码能够灵活地允许我添加更多 "Val" 列(最多可能有 10 个值)。

谢谢!

Pandas is probably the best tool for this kind of task. Start here. There are many online tutorials and YouTube videos about it. For example, this为原作者本人原创

通常在 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)通过 State/Item # 组合来计算它们。 (原则上我猜一个项目可能属于多个状态,在这种情况下我们只是从最后一个 groupby 中删除状态)。

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

这只是一个熔化(一种枢轴操作);一组;等级;一个对比;另一个分组;和一个总和(True == 1,所以对布尔值求和是一个计数)。对于一个完全的初学者来说可能有点可怕,但希望它会鼓励您尝试 pandas,因为只要有一点经验,您就可以非常有效地完成很多操作。