python - 转置熊猫数据框中的多列
问题描述
AD AP AR MD MS iS AS
0 169.88 0.00 50.50 814.0 57.3 32.3 43.230
1 12.54 0.01 84.75 93.0 51.3 36.6 43.850
2 321.38 0.00 65.08 986.0 56.7 28.9 42.070
我想将上面的数据框更改为转置版本,其中对于每一列,值都放在一行中,例如对于列AD
和AP
,它看起来像这样
d1_AD d2_AD d3_AD d1_AP d2_AP d3_AP
169.88 12.54 321.38 0.00 0.01 0.00
我可以进行转置,但是如何获得上面的列名和输出结构?
注意:为便于阅读,输出被截断,但实际输出应包括所有其他列,如AR MD MS iS AS
解决方案
我们可以rename
制作正确形式的索引,然后stack
and sort_index
,然后 Collapse MultiIndex and to_frame
andtranspose
new_df = df.rename(lambda x: f'd{x + 1}').stack().sort_index(level=1)
new_df.index = new_df.index.map('_'.join)
new_df = new_df.to_frame().transpose()
输入df
:
df = pd.DataFrame({
'AD': [169.88, 12.54, 321.38], 'AP': [0.0, 0.01, 0.0],
'AR': [50.5, 84.75, 65.08], 'MD': [814.0, 93.0, 986.0],
'MS': [57.3, 51.3, 56.7], 'iS': [32.3, 36.6, 28.9],
'AS': [43.23, 43.85, 42.07]
})
new_df
:
d1_AD d2_AD d3_AD d1_AP d2_AP ... d2_MS d3_MS d1_iS d2_iS d3_iS
0 169.88 12.54 321.38 0.0 0.01 ... 51.3 56.7 32.3 36.6 28.9
[1 rows x 21 columns]
如果字典排序不起作用,我们可以等待将 MultiIndex 转换为字符串,直到之后sort_index
:
new_df = df.stack().sort_index(level=1) # Sort level 1 (by number)
new_df.index = new_df.index.map(lambda x: f'd{x[0]+1}_{x[1]}')
new_df = new_df.to_frame().transpose()
更大的框架:
df = pd.concat([df] * 4, ignore_index=True)
截断输出:
d1_AD d2_AD d3_AD d4_AD d5_AD ... d8_iS d9_iS d10_iS d11_iS d12_iS
0 169.88 12.54 321.38 169.88 12.54 ... 36.6 28.9 32.3 36.6 28.9
[1 rows x 84 columns]
如果需要与 相同顺序的列df
,请使用melt
usingignore_index=False
不必重新计算组并让melt
处理排序:
new_df = df.melt(value_name=0, ignore_index=False)
new_df = new_df[[0]].set_axis(
# Create the new index
'd' + (new_df.index + 1).astype(str) + '_' + new_df['variable']
).transpose()
较大帧上的截断输出:
d1_AD d2_AD d3_AD d4_AD d5_AD ... d8_AS d9_AS d10_AS d11_AS d12_AS
0 169.88 12.54 321.38 169.88 12.54 ... 43.85 42.07 43.23 43.85 42.07
[1 rows x 84 columns]
推荐阅读
- continuous-integration - 如何在 CircleCI 上缓存 Elixir / Phoenix?
- javascript - 动态变化的最大范围和 document.getElementById
- android - 如何将 android 库发布到 subversion 并在项目中使用它
- birt - Birt 交叉表 - 禁用列分组
- angular - 如何在 Angular 6 项目中使用 svg.js 和插件
- angular - 逐步构建 url - Angular
- html - Hubspot 电子邮件模板在 Gmail 应用程序中没有响应
- sql - SQL 查询中的 Vlookup
- wpf - SliderThumbStyle 内的文本
- tableau-api - 分组类似于 MySQL 的 GROUP BY