python - 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。我尝试转置列,但无法得到我想要的输出。有什么帮助吗?
解决方案
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
推荐阅读
- reactjs - 如何使用 react-sortable-hoc 访问 refs,withref
- json - 构建重复值的颠簸转换
- python - 如何确定 dateparser.search.search_dates() 是否返回日期、时间或日期时间
- python - Python PDF 文件文本提取
- javascript - 我对使用 javascript 将城市列表加载到下拉列表中有些困惑
- python - python中的语音翻译器
- typescript - “getManager().query()”在 TypeORM 中是如何工作的?
- google-chrome - 如何添加多命令行参数以在 android 中打开 chrome?
- c++ - 如何将 std::set_terminate 与 SetUnhandledExceptionFilter 一起使用?
- spring-cloud-dataflow - 如何在 Spring Cloud 数据流中使用过滤器?