[英]Pivot a pandas dataframe with multiple columns
[英]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
一种选择是使用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.