如何在DataFrame中取消堆叠列?

3
我有一个名为“df”的数据框,包含53个不同的列和1740行。 这些列包括:“年龄”,“人种一”,“人种二”,“人种三”,“姓名”,“身份”等等。 但是我想重新组织数据框,以便一个新变量“RaceTimes”替换“RaceOne”,“RaceTwo”,“RaceThree”,并且其余的数据框列按照特定的方式排列,如下面第二个数据框所示...
现有数据框:
'Age'   'RaceOne'   'RaceTwo'   'RaceThree'   'Name'   'Identity'   ...   'Male/Female         
 25      15:40:00    15:35:00    15:39:00      Wendy     105888     ...    Female
 26      15:43:00    15:25:00    15:15:00      Steve     114342     ...    Male
 22      15:20:00    15:31:00    15:23:00      Ant       123553     ...    Male

我希望看到的是...

'Age'   'RaceTimes'   'Name'   'Identity'   ...   'Male/Female'
 25      15:40:00      Wendy    105888      ...    Female
 25      15:35:00      Wendy    105888      ...    Female
 25      15:39:00      Wendy    105888      ...    Female
 26      15:43:00      Steve    114342      ...    Male
 26      15:25:00      Steve    114342      ...    Male
 26      15:15:00      Steve    114342      ...    Male
 22      15:20:00      Ant      123553      ...    Male
 22      15:31:00      Ant      123553      ...    Male
 22      15:23:00      Ant      123553      ...    Male

为什么你将年龄22的“Race”值填充到了年龄26上?我错过了什么吗? - anky
抱歉,我的错误!*已编辑 - user11357465
2个回答

1
我理解为,检查 pd.wide_to_long
final=(pd.wide_to_long(df,'Race',i='Age',j='v',sep='',suffix='\w+').reset_index(1,drop=True)
 .sort_index().reset_index())

   Age Male/Female   Name  Identity  ...      Race
0   22        Male    Ant    123553  ...  15:20:00
1   22        Male    Ant    123553  ...  15:31:00
2   22        Male    Ant    123553  ...  15:23:00
3   25      Female  Wendy    105888  ...  15:40:00
4   25      Female  Wendy    105888  ...  15:35:00
5   25      Female  Wendy    105888  ...  15:39:00
6   26        Male  Steve    114342  ...  15:43:00
7   26        Male  Steve    114342  ...  15:25:00
8   26        Male  Steve    114342  ...  15:15:00

我可以问一下,它是如何知道将“Race One”、“Race Two”重新格式化为“RaceTime”的? - user11357465
@Sam 你的意思是把最终输出中的 Race 改名为 RaceTime 吗? - anky
在当前的数据框中,您有“RaceOne”、“RaceTwo”等,代码在哪里将它们转换为输出中显示的“RaceTime”? - user11357465
@Sam 所有以“Race”开头的列都会被转换为后缀\w+,意思是任何以“Raceabc..”、“Racedef”等开头的内容都会被转换成一个名为“Race”的列。请查看wide_to_long文档,您会发现我已将stubnames参数定义为Race,根据文档:“存根名称。假定宽格式变量以存根名称开头”。 - anky
啊,我明白了,讲得很有道理。谢谢,非常有帮助。如果你想做多列,我可以在“Race”旁边添加它们,假设这个后缀适用于所有列。 - user11357465
@Sam,是的,你可以传递一个 stubnames 列表 :) - anky

0

首先,请彻底研究。

Pandas内置了解决您问题的方法。 您可以使用pd.melt将DataFrame从宽格式转换为长格式。 看一下示例。 这很简单明了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接