python - 如何在python中使用映射值将日期从列转置到行?
问题描述
我有一个像这样的 python pandas 数据框:
id | Client | Type | V1 | V2 | V3 | V4 | --------------------------------------------- 0 | John | Time | 20 | 24 | | | 0 | John |Score | 7 | 8 | | | 0 | John |Level | A | B | | | 1 | Tim | Time | 15 | 19 | 20 | 18 | 1 | Tim |Score | 9 | 8 | 6 | 9 | 1 | Tim |Level | C | A | C | A | 2 | Daniel | Time | 17 | | | | 2 | Daniel |Score | 7 | | | | 2 | Daniel |Level | B | | | |
我想转置到这张表中:
Client | Time |Score | Level
--------------------------------
John | 20 | 7 | A |
John | 24 | 8 | B |
Tim | 15 | 9 | C |
Tim | 19 | 8 | A |
Tim | 20 | 6 | C |
Tim | 18 | 9 | A |
Daniel | 17 | 7 | B |
我使用 pd.melt 或 df.stack 阅读了一些帖子,但似乎我的情况有点不同。任何建议表示赞赏。
解决方案
DataFrame.melt
与 removeinf 缺失值一起使用DataFrame.dropna
,然后使用由Series.unstack
创建的助手系列重塑GroupBy.cumcount
:
df = df.melt(['id','Client','Type']).dropna(subset=['value'])
g = df.groupby(['Client','Type']).cumcount()
df1 = (df.set_index([g,'Client','Type'])['value'].unstack()
.reset_index(level=0, drop=True)
.sort_index()
.rename_axis(None, axis=1)
.reset_index())
print (df1)
Client Level Score Time
0 Daniel B 7 17
1 John A 7 20
2 John B 8 24
3 Tim C 9 15
4 Tim A 8 19
5 Tim C 6 20
6 Tim A 9 18
推荐阅读
- saml - Okta 作为 SP(入站 SAML)如何在成功登录后配置重定向 URL
- applescript - mac 上的 Spotify 流甲板插件缺少重复切换
- android - Unity - Android - BLE 蓝牙权限
- c# - 在 C# 中结合动态绑定和非托管约束
- javascript - 必须表达包含两个逻辑运算符(|| 和 &&)的复杂条件的 switch 语句看起来如何?
- python - 我想通过麦克风发送我正在计算机上收听的音频
- mysql - 如何将“当前”mysql时间戳值迁移到postgreSQL
- linux - GNU 并行 - 通过多个 ssh 跳转主机运行命令
- c - 当应用于无符号操作数和有符号操作数时,整数除法会产生不同的结果吗?
- c# - C# 使用 count 属性反序列化对象的最佳方法