我有一张这样的桌子

device_type version pool    testMean    testP50 testP90 testP99 testStd  WidgetMean WidgetP50   WidgetP90   WidgetP99   WidgetStd
PNB0Q7      8108162 123     124         136     140.8   141.88  21.35    2.2            0           6.4         9.64        3.92

我想让它变成这样:

device_type version pool   Name  Mean P50 P90   P99    Std
PNB0Q7      8108162 123    test  123  136 140.8 142.88 21.35
PNB0Q7      8108162 123   Widget 2.2   0  6.4   9.64  3.92

我try 使用melt,但得到:

df.melt(id_vars=["device_type", "version", "pool"], var_name="Name", value_name="Value")
device_type  version     pool  Name        Value
PNB0Q7       8108162     test  testMean     124.00
PNB0Q7       8108162     test  testP50      136.00
PNB0Q7       8108162     test  testP90      140.80
PNB0Q7       8108162     test  testP99      141.88
PNB0Q7       8108162     test  testStd      21.35

有没有关于如何达成预期解决方案的 idea

推荐答案

您可以先使用pd.wide_to_long和一点列命名清理,然后reshape 形状:

df = df.rename(columns={'Std':'testStd',
                        'TestP90':'testP90',
                        'TestP99':'testP99', 
                        'TestP50':'testP50'})
df_out = pd.wide_to_long(df, 
                         ['test','Widget'], 
                         ['device_type', 'version', 'pool'], 
                         'Measure', '', '.+' )
df_out = df_out.unstack(-1).stack(0).reset_index()
df_out

输出:

Measure device_type  version  pool level_3   Mean    P50    P90     P99    Std
0            PNB0Q7  8108162   123  Widget    2.2    0.0    6.4    9.64   3.92
1            PNB0Q7  8108162   123    test  124.0  136.0  140.8  141.88  21.35

更新上述"3级"重命名:

df = df.rename(columns={'Std':'testStd',
                        'TestP90':'testP90',
                        'TestP99':'testP99', 
                        'TestP50':'testP50'})
df_out = pd.wide_to_long(df, 
                         ['test','Widget'], 
                         ['device_type', 'version', 'pool'], 
                         'Measure', '', '.+' )\
            .rename_axis('Instrument', axis=1) #add this line to rename column header axis
df_out = df_out.unstack(-1).stack(0).reset_index()
df_out

输出:

Measure device_type  version  pool Instrument   Mean    P50    P90     P99    Std
0            PNB0Q7  8108162   123     Widget    2.2    0.0    6.4    9.64   3.92
1            PNB0Q7  8108162   123       test  124.0  136.0  140.8  141.88  21.35

Python-3.x相关问答推荐

为什么我必须在绘制椭圆时代码等于两次?''

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

使用PANAS根据另两个列表中的值对一个列表中的字符串值进行分组

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

如何从包含SPAN文本的标记中获取链接

如何将python点击参数设置为与选项回调不同的参数的别名?

数据框中从每个组/ID的底部删除行

隐藏Cartopy中高纬度非矩形投影的右侧轴(纬度)标签

无法理解此递归函数的分配和环境用法

你如何表达一个没有参数的 Python Callable?

在两个数据框之间查找相等的列

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

Python 错误:IndexError:字符串索引超出范围

if 语句中冒号的语法错误

根据条件过滤元组列表

无论如何我可以在 Google colaboratory 中下载文件吗?

Python3 - 如何从现有抽象类定义抽象子类?

在 linux mint 上安装 python3-venv 模块

Python 3中星型导入的函数形式是什么

如何删除目录? os.removedirs 和 os.rmdir 是否只用于删除空目录?