Pandas 取消包含重复项的多索引的堆栈

Pandas 取消包含重复项的多索引的堆栈,pandas,Pandas,我有一个像这样的数据框 Date ID Value Mar-20 A 100 Mar-20 B 200 Mar-20 C 300 Apr-20 A 101 Apr-20 B 201 Apr-20 C 301 Value ID A B c Date Mar-20 100 200 300 Apr-20 101 201 301

我有一个像这样的数据框

Date     ID   Value
Mar-20   A     100
Mar-20   B     200
Mar-20   C     300
Apr-20   A     101
Apr-20   B     201
Apr-20   C     301
        Value
ID       A      B      c
Date
Mar-20  100    200    300
Apr-20  101    201    301
         Value 
Date     ID     A    B    C
Mar-20   A     100  NaN  NaN
Mar-20   B     NaN  200  NaN
Mar-20   C     NaN  NaN  300
Apr-20   A     101  NaN  NaN 
Apr-20   B     NaN  201  NaN 
Apr-20   C     NaN  NaN  301
我正试图重新塑造它,使它看起来像这样

Date     ID   Value
Mar-20   A     100
Mar-20   B     200
Mar-20   C     300
Apr-20   A     101
Apr-20   B     201
Apr-20   C     301
        Value
ID       A      B      c
Date
Mar-20  100    200    300
Apr-20  101    201    301
         Value 
Date     ID     A    B    C
Mar-20   A     100  NaN  NaN
Mar-20   B     NaN  200  NaN
Mar-20   C     NaN  NaN  300
Apr-20   A     101  NaN  NaN 
Apr-20   B     NaN  201  NaN 
Apr-20   C     NaN  NaN  301
我从尝试开始

df = df.set_index(["Date", "ID"])
但取消此项的堆栈将导致以下值错误:“索引包含重复的条目,无法重塑” 因此,我发现这个建议是如此,这让我大开眼界

df = df.set_index(["Date", "ID"].append = True)
但是当我通过“ID”(即df=df.unstack(“ID”)取消堆栈时,我的最终数据帧如下所示

Date     ID   Value
Mar-20   A     100
Mar-20   B     200
Mar-20   C     300
Apr-20   A     101
Apr-20   B     201
Apr-20   C     301
        Value
ID       A      B      c
Date
Mar-20  100    200    300
Apr-20  101    201    301
         Value 
Date     ID     A    B    C
Mar-20   A     100  NaN  NaN
Mar-20   B     NaN  200  NaN
Mar-20   C     NaN  NaN  300
Apr-20   A     101  NaN  NaN 
Apr-20   B     NaN  201  NaN 
Apr-20   C     NaN  NaN  301
我如何压缩它以获得我想要的输出

非常感谢使用预期输出(索引顺序已更改):

如需正确订购,请添加:

如果需要正确顺序的原始格式:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.set_index(["Date", "ID"]).unstack().rename(lambda x: x.strftime('%b-%y'))
print (df)
       Value          
ID         A    B    C
Date                  
Mar-20   100  200  300
Apr-20   101  201  301
如果只有3列,则可以使用,但如果有更多列,则会失败,因此,如果常规数据:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.pivot(*df.columns).rename(lambda x: x.strftime('%b-%y'))
print (df)
ID        A    B    C
Date                 
Mar-20  100  200  300
Apr-20  101  201  301
如果输入数据中有任何列需要旋转,则只需使用大约3列:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%y')
df = df.pivot('Date','ID','Value').rename(lambda x: x.strftime('%b-%y'))
print (df)
ID        A    B    C
Date                 
Mar-20  100  200  300
Apr-20  101  201  301
编辑:如果获取错误:

索引包含重复项,无法重新设置形状

这意味着每对
日期、ID
都有重复项,因此有必要使用聚合函数,如
求和
平均值

如果需要,更好的解决方案避免排序,谢谢@anky:

df = df.groupby(["Date", "ID"],sort=False)['Value'].sum().unstack()
print (df)
ID        A    B    C
Date                 
Mar-20  600  200  300
Apr-20  101  201  301

@YOBEN_S-ya,你说的是75%对,不幸的是,这个日期有点复杂。@jezrael df.pivot(*df.columns)?@YOBEN_S-很好,请补充回答。@jezrael会重新打开hehThanks,因为他回来找我。当我尝试第一个版本时,我得到的值错误是“索引包含重复项,无法重新塑造”。当我添加append=True来设置_索引时,我会加载不同版本的索引(每个ID 1个)@harrison10001-检查最后一段以获得解决方案。非常感谢。我会给出一个shot@anky-谢谢。