python - pandas 根据前缀重塑 long
问题描述
我有一个带有以下列的 Pandas 数据框
game_id, date, country, winner_name, winner_age, ... winner_ranking, loser_name, loser_age, ... loser_ranking
1 1/2/10 UK . Ben 21 12 Michael 22 . 13
我想将其重塑为以下格式
game_id, date, country, competitor, name, age, ranking
1 1/2/10 UK winner Ben 21 12
1 1/2/10 UK loser Michael 22 13
即对于以前缀“winner_”或“loser_”开头的每一列,删除此前缀,并将获胜者和失败者分成不同的行。赢家和输家变量的列表很长,所以如果我必须硬编码,它就没有多大帮助。
这是我目前的做法,我想知道是否有更简洁的方法,例如使用融化?
winner_df = combined_df.loc[:,[x for x in colnames if 'loser_' not in x]]
winner_df.columns = [c.replace('winner_','') for c in winner_df.columns]
winner_df['competitor'] = 'winner'
loser_df = combined_df.loc[:,[x for x in colnames if 'winner_' not in x]]
loser_df.columns = [c.replace('loser_','') for c in loser_df.columns]
loser_df['competitor'] = 'loser'
long_df = winner_df.append(loser_df,sort=False)
解决方案
首先MultiIndex
使用拆分器从所有没有列的列DataFrame.set_index
创建,然后MultiIndex
在列中创建,最后通过使用和列Series.str.split
重塑:DataFrame.stack
DataFrame.reset_index
rename
df = df.set_index(['game_id','date','country'])
df.columns = df.columns.str.split('_', expand=True)
df = df.stack(0).reset_index().rename(columns={'level_3':'competitor'})
print (df)
game_id date country competitor age name ranking
0 1 1/2/10 UK loser 22 Michael 13
1 1 1/2/10 UK winner 21 Ben 12
推荐阅读
- java - 没有选中项时如何完成 ActionMode?
- python - 有没有办法使用 pyplot 和 pandas 绘制在 Python 中只有特定值的所有列?
- sql - 查询列表中的 JSON 对象 (Postgres 11)
- node.js - 为什么 cURL 返回正确的值而不是 node-libcurl?
- r - 在ggplot中为特定颜色着色最大,最小和中值价格路径
- graph - 绘制线性函数的最佳工具是什么?
- javascript - 获取其中包含特定单词的所有链接
- mongodb - 按数组长度排序mongodb
- c# - 是否可以从 gRPC 中的服务器获取客户端延迟?
- latex - 投影仪参考书目中的项目符号与框架主题重叠。如何删除项目符号和/或正确缩进参考书目?