【问题标题】:Can we separate data using Unique ID in to the following format?我们可以将使用唯一 ID 的数据分隔为以下格式吗?
【发布时间】:2021-04-07 10:29:49
【问题描述】:

当前格式:

UNIQUE ID NAME AGE DEP RANK
001 John 10 4th 1
002 Priya 11 4th 2
003 Jack 15 5th 2
004 Jill 14 5th 1

预期格式:

UNIQUE ID NAME COLUMN_NO
001 John 1
001 10 2
001 4th 3
001 1 4
002 Priya 1
002 11 2
002 4th 3
002 2 4

【问题讨论】:

  • 我想使用 python 将当前格式数据转换为所需格式并提取到 Excel 工作表中。
  • 源数据以哪种格式(数据库、XLSX、CSV...)可用?您需要/想要/必须/不得使用哪些软件包?熊猫在桌子上吗?无论如何:到目前为止,您尝试了什么?
  • 正式是 XLSX,Pandas 在桌面上。使用 pandas 的包,从 re 拆分出来

标签: python-3.x datatable extract data-manipulation


【解决方案1】:

我的出发点:

>>> df
    UNIQUE ID   NAME    AGE  DEP   RANK
0           1   John     10  4th      1
1           2  Priya     11  4th      2
2           3   Jack     15  5th      2
3           4   Jill     14  5th      1

您需要的基本转换由df.stack 提供,结果是:

0  UNIQUE ID         1
   NAME           John
   AGE              10
   DEP             4th
   RANK              1
1  UNIQUE ID         2
   NAME          Priya
[...]

但是,您希望将列 UNIQUE ID 单独处理。这可以通过将其设为索引来完成:

>>> df.set_index('UNIQUE ID').stack()
UNIQUE ID
1          NAME     John
           AGE         10
           DEP       4th
           RANK         1
2          NAME    Priya
           AGE         11
           DEP       4th
           RANK         2

最后缺少的位是列名:您希望将它们重命名为数字。这可以通过两种不同的方式来实现:a) 通过重新分配 df.columns(首先将列 UNIQUE ID 移动到索引之后):

df = df.set_index('UNIQUE_ID')
df.columns = range(1, 5)

或 b) df.renaming 列:

df = df.set_index('UNIQUE_ID')
df = df.rename(columns={'NAME': 1, 'AGE': 2, 'DEP': 3, 'RANK': 4})

最后,您可以将生成的 Series 转换回 DataFrame。在正确位置获取COLUMN NO 的最优雅方法是在堆叠之前使用df.rename_axis。一起作为一个表达式(最好将其拆分):

>>> (df.set_index('UNIQUE ID')
       .rename(columns={'NAME': 1, 'AGE': 2, 'DEP': 3, 'RANK': 4})
       .rename_axis('COLUMN NO', axis=1)
       .stack()
       .to_frame('NAME')
       .reset_index())

    UNIQUE ID  COLUMN NO    NAME
0           1          1   John
1           1          2      10
2           1          3    4th
3           1          4       1
4           2          1  Priya
5           2          2      11
6           2          3    4th
7           2          4       2
8           3          1   Jack
9           3          2      15
10          3          3    5th
11          3          4       2
12          4          1   Jill
13          4          2      14
14          4          3    5th
15          4          4       1

遗漏的事情:读取数据;保留正确的类型:UNIQUE ID 看起来只是数字,但有可能要保留的前导零;所以将它们解析为字符串会更好。

【讨论】:

  • 哇,非常感谢。效果很好。
  • 不需要谢谢 - 但这里习惯使用答案旁边的复选标记(在投票按钮下方)接受有用/最佳答案。但很高兴它有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多