熊猫将多行转换为具有2个索引的多列的单行

时间:2020-03-15 22:02:04

标签: python pandas

我正在尝试从以下方式转换熊猫数据框:

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()

但出现错误:

索引包含重复的条目,无法调整。

尽我所能,不明白为什么。

感谢您的帮助!

2 个答案:

答案 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,添加了列展平,行展平