繁体   English   中英

pandas pivot a DataFrame 通过多个动态列

[英]pandas pivot a DataFrame by multiple and dynamic columns

我想以更充分的方式实现类似下面的内容。 我认为 df.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)

DataFrame.melt

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

你选择了一条艰难的道路。

尝试这个:

df = df.T
df

它打印:

在此处输入图像描述

一种选择是使用pyjanitor中的pivot_longer转换为长格式两次,使用.value占位符 ---> .value确定列的哪些部分保留为标题:

# pip install pyjanitor
import pandas as pd
import janitor

(df
.pivot_longer(
    index = ['level*', '*value'], 
    names_to = '.value', 
    names_pattern ="(.+)\d")
.pivot_longer(
    index = ['level*', 'id'], 
    names_to = ('item', '.value'), 
    names_sep = '_')
)
  level1 level2  level3   id item  value
0      a      b     100  111  foo    0.1
1      a      b     101  222  foo    0.2
2      a      b     100  333  foo    0.1
3      a      b     101  444  foo    0.2
4      a      b     100  111  bar    0.3
5      a      b     101  222  bar    0.4
6      a      b     100  333  bar    0.3
7      a      b     101  444  bar    0.4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM