我有一张这样的桌子

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相关问答推荐

使用Python装载. iso文件

一种基于绝对排序值的极框索引和列定位的Python方法

字符串块数组:如何根据一个数组中的元素对另一个数组中的元素进行分组

PANDAS中当前数据帧的匹配与更新

以某种方式分割字符串

Select 作为 MultiIndex 一部分的两个 DatetimeIndex 之间的行

删除浮点型数据集中每列重复值比例超过一定阈值的列

为什么不能用格式字符串 '-' 绘制点?

在 groupby 之后,Pandas 在特定类别中获得最常见和最后的值

SqlAlchemy - 从 oracle db 中检索长文本

如何融化具有自定义名称的Pandas

两个Pandas数据框中的共同列列表

为什么不切换到 Python 3.x?

如何确定一个类的元类?

sys.stdin.readline() 读取时没有提示,返回 'nothing in between'

为什么`multiprocessing.Queue.get`这么慢?

如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

每次启动 Google Colab 时都必须安装所需的软件包吗?

将字符串拆分为最大长度 X 的片段 - 仅在空格处拆分

如何创建一个永远在其上运行滚动协程的事件循环?