我有一个看起来像这样的数据框:
2000 2001 2002 2003
Area Item Unit Code
A X j 00 val val val val
A Y k 01 val val val val
A Z k 10 val val val val
B X j 00 val val val val
B Y k 01 val val val val
B Z k 10 val val val val
我想对区域进行求和以生成如下所示的 DataFrame:
2000 2001 2002 2003
Area Item Unit Code
C X j 00 val val val val
C Y k 01 val val val val
C Z k 10 val val val val
如果我使用df = df.sum(level = "Item")
,索引的其余部分将被删除,我得到(我期望的):
2000 2001 2002 2003
X val val val val
Y val val val val
Z val val val val
我可以做df = pd.concat([df],keys = ["C"],names = ["Area"])
,来解决“Area”方面的问题,但是对索引的其余部分没有帮助。
我找不到一种方法来对区域数据进行求和,同时保留 DataFrame 的结构。
我的实际数据框比我给出的示例大(Area
值变为 A B C ... ZY ZZ
等)。
最佳答案
首先在没有第一个Area
的所有级别上使用sum
,然后创建由C
填充的新列,按DataFrame.set_index
添加到索引与 append=True
和最后 DataFrame.reorder_levels
对于此列的第一个位置:
print (df)
2000 2001 2002 2003
Area Item Unit Code
A X j 0 10 10 10 10
Y k 1 10 10 10 10
Z k 10 10 10 10 10
B X j 0 10 10 10 10
Y k 1 10 10 10 10
Z k 10 10 10 10 10
df1 = (df.sum(level = ["Item","Unit","Code"])
.assign(Area = 'C')
.set_index('Area', append=True)
.reorder_levels([3,0,1,2]))
print (df1)
2000 2001 2002 2003
Area Item Unit Code
C X j 0 20 20 20 20
Y k 1 20 20 20 20
Z k 10 20 20 20 20
另一个解决方案:
df1 = (df.sum(level = ["Item","Unit","Code"])
.assign(Area = 'C')
.reset_index()
.set_index(["Area", "Item","Unit","Code"]))
print (df1)
2000 2001 2002 2003
Area Item Unit Code
C X j 0 20 20 20 20
Y k 1 20 20 20 20
Z k 10 20 20 20 20
关于python - 有没有一种方法可以对数据帧中的索引级别求和,同时保留重复的索引级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59454649/