我想以一种更充分的方式实现下面这样的目标.我想是的.pivot也许能做到,但我做不到.有什么建议吗?

import pandas as pd
df = pd.DataFrame({'level1':['a', 'a'], 'level2':['b', 'b'], 'level3':[100, 101], 'id1':[111,222],'id2':[333,444], 'foo_value':[0.1,0.2], 'bar_value':[0.3,0.4]})

# now i want to re-shape it to below
rows = []
items = [col.replace("_value", "") for col in df.columns if col.endswith("_value")]
for _, row in df.iterrows():
    for id_col in ("id1", "id2"):
        for item in items:
            rows.append({
                "id": row[id_col],
                "item": item,
                "value": row[f"{item}_value"],
                "level1": row["level1"],
                "level2": row["level2"],
                "level3": row["level3"]
            })
reshaped_df = pd.DataFrame(rows)

推荐答案

数据帧.熔化

l = ['level1', 'level2', 'level3']
s1 = df.melt(l, value_vars=df.filter(like='id'), value_name='id')
s2 = df.melt(l, value_vars=df.filter(like='_value'), var_name='item')

out = s1.merge(s2).drop('variable', axis=1)

后果

print(out)

  level1 level2  level3   id       item  value
0      a      b     100  111  foo_value    0.1
1      a      b     100  111  bar_value    0.3
2      a      b     100  333  foo_value    0.1
3      a      b     100  333  bar_value    0.3
4      a      b     101  222  foo_value    0.2
5      a      b     101  222  bar_value    0.4
6      a      b     101  444  foo_value    0.2
7      a      b     101  444  bar_value    0.4

Python相关问答推荐

'discord.ext. commanders.cog没有属性监听器'

有症状地 destruct 了Python中的regex?

可变参数数量的重载类型(args或kwargs)

海运图:调整行和列标签

在Python Attrs包中,如何在field_Transformer函数中添加字段?

多指标不同顺序串联大Pandas 模型

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

如何在Python中获取`Genericums`超级类型?

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

(Python/Pandas)基于列中非缺失值的子集DataFrame

PYTHON、VLC、RTSP.屏幕截图不起作用

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

为什么Python内存中的列表大小与文档不匹配?

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

使用嵌套对象字段的Qdrant过滤

如何使用加速广播主进程张量?

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

随机森林n_估计器的计算

正在try 让Python读取特定的CSV文件

如何删除剪裁圆的对角线的外部部分