pandas - 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 | 费尔南多 |
我的解决方案是:
- 将旧数据帧中的所有参考 ID 写入新数据帧
- 将旧数据帧中的所有 Person-Id 写入新数据帧,它们的 reference_id 不在旧数据帧中(参见示例费尔南多)
- 循环遍历“旧”数据帧并将名称添加到新数据帧中的相应行
您对如何使其更快/更简单有任何建议吗?
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'])
解决方案
你可以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 | 费尔南多 | 没有任何 | 没有任何 |
推荐阅读
- postgresql - 将 psycopg2 查询结果写入 pyspark 数据帧
- php - SugarCRM - 使用 API v10 创建 CommentLog
- javascript - 如何从 iframe 内容中的 div 中删除类
- python-3.x - 具有持久实体的 Python Azure 计时器功能
- java - 即使 Cassandra 关闭,Spring Boot 应用程序也应该启动
- reactjs - TypeError: Converting circular structure to JSON , Axios React Express
- swift - 如何在 swiftUI 中使用 Foreach 在 LazyVGrid 中获取一条线
- python - 如何使一个命令不需要 discord.py 前缀?
- anova - 方差分析的正态假设
- flutter - Flutter 和 Fire Storage:如何通过通知实际下载文件