python - 用多个列组重塑 Pandas 数据框
问题描述
我目前有一个宽数据框,如下所示:
Index ID1 ID2 Foc_A Foc_B Foc_C Sat_A Sat_B Sat_C
0 r 1 10 15 17 100 105 107
1 r 2 20 25 27 110 115 117
2 s 1 30 35 37 120 125 127
3 s 2 40 45 47 130 135 137
每个条目都有多个标识符列(ID1 和 ID2)。然后,我有两个单独的测量类别(Foc 和 Sat),每个类别都包含多个标识符(A、B、C)(类别标识符在类别之间共享)。我最终需要将它绘制在 facet_grid 中,其中 x 和 y 作为每个测量类别并由类别标识符分隔,所以我试图重塑它,使其看起来像这样:
Index ID1 ID2 Ch Foc Sat
0 r 1 A 10 100
1 r 1 B 15 105
2 r 1 C 17 107
3 r 2 A 20 110
4 r 2 B 25 115
5 r 2 C 27 117
6 s 1 A 30 120
7 s 1 B 35 125
8 s 1 C 37 127
我一直在尝试 .melt、.pivot 和 .stack,但不了解我做得很好以取得进展。
解决方案
你正在以正确的方式思考。你可以做:
# melt the dataframe
d1 = df.set_index(['Index', 'ID1', 'ID2']).stack().reset_index()
# create separate column
d1[['flag', 'Ch']] = d1['level_3'].str.split('_', expand=True)
d1 = d1.drop('level_3', 1)
d1 = d1.rename(columns = {0: 'Foc'})
# expand the dataframe to wide
d2 = pd.pivot_table(d1, index=['Index', 'ID1', 'ID2', 'Ch'], columns=['flag']).reset_index()
# fix column names
d2.columns = ['Index', 'ID1', 'ID2', 'Ch', 'Foc', 'Sat']
print(d2.head())
Index ID1 ID2 Ch Foc Sat
0 0 r 1 A 10 100
1 0 r 1 B 15 105
2 0 r 1 C 17 107
3 1 r 2 A 20 110
4 1 r 2 B 25 115
推荐阅读
- ansible - Ansible AWX 将 .cloud 电子邮件显示为无效
- r - 按列组合的完整案例数
- python - 如何在 Python 中检索正在运行的进程的命令
- xml - 如何仅从 xml 文件中提取特定部分并合并它们?
- c# - 如何在 C# 中将 IST 转换为 CET 时区,
- c - 我应该(明确地)将函数声明为 extern 吗?
- html - 我可以在 XSLT 模板中呈现 HTML 代码吗
- python - ValueError:检查输入时出错:预期dense_85_input有4维,但在MNIST上得到了形状为(60000、28、28)的数组
- javascript - 单击链接时如何获取父链接的文本
- sql - 使用 sql 函数避免在具有不同参数值的同一查询之间进行联合