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-谢谢。