首页 > 解决方案 > Pandas 基于列计算顺序

问题描述

也许这不是一个合适的标题,但让我解释一下我的问题。

以下是我的数据框:

company manager_1 manager_2 manager_3 manager_4 manager_5 manager_6 _manager_7
Ford     AB         AC         AD       AE       AF       AG         AH
BMW      BA         BC         BD       BE       BF
FIAT     CA         CB         CD       CE       CF       CG
Mercedes BC         GA         GB    

我需要将这些不同的列转换为一个列,并根据我想创建一个附加列的顺序。我需要的基本上是这个(我不在乎公司名称,因为它只是一个玩具示例)

name  order
AB    7
AC    6
AD    5
AE    4
AF    3
AG    2
AH    1
BA    5
BC    4
BD    3
BE    2
BF    1

实际上,manager_7 是公司的第一个经理,所以它需要数字 1,例如 AH,对应的数字是 1。我尝试转置列,但无法得到我想要的输出。有什么帮助吗?

标签: pythonpandas

解决方案


IIUC,我们只需要在每一行中做一个递减计数。我们可以通过堆叠以更方便的顺序获取行值:

new = df.drop("company", 1).stack().to_frame("name")
new["order"] = new.groupby(level=0).cumcount(ascending=False) + 1
new = new.reset_index(drop=True)

给我

In [65]: new
Out[65]: 
   name  order
0    AB      7
1    AC      6
2    AD      5
3    AE      4
4    AF      3
5    AG      2
6    AH      1
7    BA      5
8    BC      4
9    BD      3
10   BE      2
11   BF      1
12   CA      6
13   CB      5
14   CD      4
15   CE      3
16   CF      2
17   CG      1
18   BC      3
19   GA      2
20   GB      1

这假设您未显示的值(例如 manager_6/BMW)实际上为空。如果它们是空字符串,则只需预先添加一个,或在该步骤df = df.replace("", np.nan)之后手动删除它们。stack


推荐阅读