我正在尝试从以下方式转换熊猫数据框:
ID ID_ver type count price discount
1 1 a 4 100 20
1 1 b 3 50 0
1 2 a 4 100 30
1 2 b 3 50 5
1 2 c 1 70 10
收件人:
ID ID_ver count_a price_a discount_a count_b price_b discount_b count_c price_c discount_c
我有10种可能的类型和数千个ID,每个ID最多有10个版本。
我尝试过:
df.drop_duplicates()
df.set_index(['ID','ID_VER','TYPE'])[['count','PRICE','DISCOUNT']].unstack()
但出现错误:
索引包含重复的条目,无法调整。
尽我所能,不明白为什么。
感谢您的帮助!
答案 0 :(得分:0)
pandas
使用唯一值作为索引。您设置了一个三重索引,似乎有些观察如果具有相同的三个值。结果,pandas
引发错误。
我可以通过更改示例的一个值来重现您的错误,以使两个观察值具有相同的索引值:
import pandas as pd
df = pd.read_clipboard()
df.iloc[2, 1] = 1
观察0和2现在具有相同的(未来)索引值,这将引发错误。
ID ID_ver type count price discount
0 1 1 a 4 100 20 # 1, 1, a
1 1 1 b 3 50 0
2 1 1 a 4 100 30 # 1, 1, a
3 1 2 b 3 50 5
4 1 2 c 1 70 10
df.set_index(['ID','ID_ver','type'])[['count','price','discount']].unstack()
ValueError:索引包含重复的条目,无法重塑
答案 1 :(得分:0)
我认为您想要这样的东西:
pd.pivot_table(your_df, values=['count', 'price', 'discount'], index=['ID','ID_ver'], columns='type')
如果要从多索引列中展平:
your_df.columns = ['_'.join(col).strip() for col in your_df.columns.values]
要展平行多索引:
your_df = your_df.reset_index()
编辑:更改为ivot_table,添加了列展平,行展平