python - 在一列中给定相同的值,连接剩余的行?
问题描述
给定熊猫数据框:
name hobby since
paul A 1995
john A 2005
paul B 2015
mary G 2013
chris E 2005
chris D 2001
paul C 1986
我想得到:
name hobby1 since1 hobby2 since2 hobby3 since3
paul A 1995 B 2015 C 1986
john A 2005 NaN NaN NaN NaN
mary G 2013 NaN NaN NaN NaN
chris E 2005 D 2001 NaN NaN
即我想每个名字有一行。一个人可以拥有的最大爱好数量,在这种情况下说 3,是我事先知道的。最优雅/最简洁的方法是什么?
解决方案
您可以先melt
,然后,groupby.cumcount()
添加到variable
,然后使用pivot_table()
:
m=df.melt('name')
(m.assign(variable=m.variable+(m.groupby(['name','variable']).cumcount()+1).astype(str))
.pivot_table(index='name',columns='variable',values='value',aggfunc='first')
.rename_axis(None,axis=1))
hobby1 hobby2 hobby3 since1 since2 since3
name
chris E D NaN 2005 2001 NaN
john A NaN NaN 2005 NaN NaN
mary G NaN NaN 2013 NaN NaN
paul A B C 1995 2015 1986
推荐阅读
- c - 可以在 C 中的函数调用的参数之间放置注释吗?
- javascript - 如何获取基于文本框实时更改的图像链接?
- python - Python 中的 Pyo:未定义名称“服务器”
- xaml - 属性“内容”设置不止一次 Xamarin Forms
- batch-file - 如何在批处理文件中创建依赖于 %time %date% 等其他变量的变量?
- c# - 当按钮单击 UWP 时导航到带有选定组合框项的新页面
- elasticsearch - Elasticsearch 时间范围查询和数据
- java - 放心 - post() - java.lang.NullPointerException:无法在空对象上调用方法 trim()
- c# - 如何拆分字符串并相对于父级创建一个
- firebase - Flutter Firebase 应用内消息