python - 有没有一种方法可以对数据帧中的索引级别求和,同时保留重复的索引级别?

标签 python pandas dataframe python-3.7 multi-index

我有一个看起来像这样的数据框:

                     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/

相关文章:

python - 按项目对元组列表进行分组

python - 如何为图像添加高斯噪声?

python - Pandas :为什么你可以对具有不同索引的系列进行算术运算,但不能进行比较?

python - 如何使用 Pandas MultiIndex DataFrame 中的先前值进行计算?

r - 拆分数据框以创建新列

r - 逐行操作 data.frame 中的一列的更快方法是什么?

python - 将 matplotlib 图形 Canvas 图像插入 QTextDocument

python - lxml 中的解析函数出错

python - 从 Pandas 的日期时间列中减去一年

python - 如何在 python pandas 中将标题行转换为新列?