首页 > 解决方案 > Python Pandas:将数据从垂直重新排列到水平

问题描述

我想使用熊猫转换数据框。

旧数据框:

个人ID 参考 ID 姓名
1 1 最大限度
2 1 凯文
3 1 萨拉
4 4 切西
5 9 费尔南多

进入以下格式的新数据框。

新数据框:

个人ID 参考 ID 会员1 会员2 会员3
1 1 最大限度 凯文 萨拉
4 4 切西
5 9 费尔南多

我的解决方案是:

  1. 将旧数据帧中的所有参考 ID 写入新数据帧
  2. 将旧数据帧中的所有 Person-Id 写入新数据帧,它们的 reference_id 不在旧数据帧中(参见示例费尔南多)
  3. 循环遍历“旧”数据帧并将名称添加到新数据帧中的相应行

您对如何使其更快/更简单有任何建议吗?

PS:旧数据框可以这样制作

person_id = [1,2,3,4,5]
reference_id = [1,1,1,4,9]
name = ['Max','Kevin','Sara',"Chessi","Fernando"]
list_tuples=list(zip(person_id,reference_id,name))
old_dataframe = pd.DataFrame(list_tuples,columns=['Person_ID','Reference_id','Name'])

标签: pandasdataframe

解决方案


你可以pivot_table()这样使用:

df1= pd.pivot_table(df, index=['Reference-ID'], values=['Person-ID', 'Name'], aggfunc=({'Person-ID':'min', 'Name':lambda x:list(x), 'Person-ID':'min'}))

df1.reset_index()[['Person-ID','Reference-ID']].join(pd.DataFrame(df1.Name.tolist()))

输出:

个人ID 参考 ID 0 1 2
1 1 最大限度 凯文 萨拉
4 4 切西 没有任何 没有任何
5 9 费尔南多 没有任何 没有任何

您可以像这样重新分配列名:

df2=df1.reset_index()[['Person-ID','Reference-ID']].join(pd.DataFrame(df1.Name.tolist()))

df2.columns=list(df2.columns[0:2])+[f"Member{x+1}" for x in df2.columns[2:]]

输出:

个人ID 参考 ID 会员1 会员2 会员3
1 1 最大限度 凯文 萨拉
4 4 切西 没有任何 没有任何
5 9 费尔南多 没有任何 没有任何

推荐阅读