当前位置: 首页 > 面试题库 >

Python(Pandas)在多索引数据框的每个lvl上添加小计

柳飞鸾
2023-03-14
问题内容

假设我有以下数据框:

a       b       c      Sce1     Sce2    Sce3    Sce4    Sce5    Sc6
Animal  Ground  Dog    0.0      0.9     0.5     0.0     0.3     0.4  
Animal  Ground  Cat    0.6      0.5     0.3     0.5     1.0     0.2 
Animal  Air     Eagle  1.0      0.1     0.1     0.6     0.9     0.1 
Animal  Air     Owl    0.3      0.1     0.5     0.3     0.5     0.9     
Object  Metal   Car    0.3      0.3     0.8     0.6     0.5     0.6 
Object  Metal   Bike   0.5      0.1     0.4     0.7     0.4     0.2 
Object  Wood    Chair  0.9      0.6     0.1     0.9     0.2     0.8 
Object  Wood    Table  0.9      0.6     0.6     0.1     0.9     0.7

我想创建一个MultiIndex,它将包含每个lvl的总和。输出将如下所示:

a      b      c     Sce1    Sce2    Sce3    Sce4    Sce5    Sce6
Animal              1.9     1.6     1.4     1.3     2.7     1.6 
       Ground       0.6     1.4     0.8     0.5     1.3     0.6 
              Dog   0.0     0.9     0.5     0.0     0.3     0.4 
              Cat   0.6     0.5     0.3     0.5     1.0     0.2 
       Air          1.3     0.2     0.7     0.8     1.4     1.0 
              Eagle 1.0     0.1     0.1     0.6     0.9     0.1 
              Owl   0.3     0.1     0.5     0.3     0.5     0.9 
Object              2.6     1.6     1.8     2.3     2.0     2.3 
       Metal        0.8     0.3     1.1     1.3     0.9     0.8 
              Car   0.3     0.3     0.8     0.6     0.5     0.6 
              Bike  0.5     0.1     0.4     0.7     0.4     0.2 
       Wood         1.8     1.3     0.6     1.0     1.1     1.5 
              Chair 0.9     0.6     0.1     0.9     0.2     0.8 
              Table 0.9     0.6     0.6     0.1     0.9     0.7

目前,我正在使用循环在每个级别上创建三个不同的数据框,然后在excel上对其进行操作,如下所示。因此,如果可能的话,我想在python中进行此计算。

for i in range range(0,3):
    df = df.groupby(list(df.columns)[0:lvl], as_index=False).sum()
    return df

提前谢谢了。


问题答案:

一些自由使用 MAGIC

pd.concat([
        df.assign(
            **{x: 'Total' for x in 'abc'[i:]}
        ).groupby(list('abc')).sum() for i in range(4)
    ]).sort_index()

                     Sce1  Sce2  Sce3  Sce4  Sce5  Sc6
a      b      c                                       
Animal Air    Eagle   1.0   0.1   0.1   0.6   0.9  0.1
              Owl     0.3   0.1   0.5   0.3   0.5  0.9
              Total   1.3   0.2   0.6   0.9   1.4  1.0
       Ground Cat     0.6   0.5   0.3   0.5   1.0  0.2
              Dog     0.0   0.9   0.5   0.0   0.3  0.4
              Total   0.6   1.4   0.8   0.5   1.3  0.6
       Total  Total   1.9   1.6   1.4   1.4   2.7  1.6
Object Metal  Bike    0.5   0.1   0.4   0.7   0.4  0.2
              Car     0.3   0.3   0.8   0.6   0.5  0.6
              Total   0.8   0.4   1.2   1.3   0.9  0.8
       Total  Total   2.6   1.6   1.9   2.3   2.0  2.3
       Wood   Chair   0.9   0.6   0.1   0.9   0.2  0.8
              Table   0.9   0.6   0.6   0.1   0.9  0.7
              Total   1.8   1.2   0.7   1.0   1.1  1.5
Total  Total  Total   4.5   3.2   3.3   3.7   4.7  3.9

我可以完全按照您的要求

pd.concat([
        df.assign(
            **{x: '' for x in 'abc'[i:]}
        ).groupby(list('abc')).sum() for i in range(1, 4)
    ]).sort_index()

                     Sce1  Sce2  Sce3  Sce4  Sce5  Sc6
a      b      c                                       
Animal                1.9   1.6   1.4   1.4   2.7  1.6
       Air            1.3   0.2   0.6   0.9   1.4  1.0
              Eagle   1.0   0.1   0.1   0.6   0.9  0.1
              Owl     0.3   0.1   0.5   0.3   0.5  0.9
       Ground         0.6   1.4   0.8   0.5   1.3  0.6
              Cat     0.6   0.5   0.3   0.5   1.0  0.2
              Dog     0.0   0.9   0.5   0.0   0.3  0.4
Object                2.6   1.6   1.9   2.3   2.0  2.3
       Metal          0.8   0.4   1.2   1.3   0.9  0.8
              Bike    0.5   0.1   0.4   0.7   0.4  0.2
              Car     0.3   0.3   0.8   0.6   0.5  0.6
       Wood           1.8   1.2   0.7   1.0   1.1  1.5
              Chair   0.9   0.6   0.1   0.9   0.2  0.8
              Table   0.9   0.6   0.6   0.1   0.9  0.7

至于如何!我将其留给读者练习。



 类似资料:
  • 问题内容: 用更多索引范围(例如by和)对数据帧进行切片的pythonic方法是什么? 我想要一个更优雅的方式: 结果: 像这样的东西会更优雅: 问题答案: 您可以使用numpy的“切片技巧”: 给出:

  • 基于单个值/标签的切片 基于一个或多个级别的多个标签的切片 布尔条件和表达式的过滤 哪些方法适用于什么情况 为简单起见的假设: 输入数据表没有重复的索引键 下面的输入数据只有两个级别。(此处所示的大多数解决方案都概括为N个级别) 问题2b 我如何获得级别“二”中对应于“t”和“w”的所有值? 如何从检索横截面,即具有索引特定值的单行?具体来说,如何检索的横截面,由 如何选择与和相对应的两行?

  • 问题内容: 我需要使用具有多个索引的大型数据框,因此我尝试创建一个数据框以了解如何将其存储在hdf5文件中。数据框是这样的:(在前2列中有multi索引) 我正在使用pandas.to_hdf,但在尝试选择组中的数据时会创建“固定格式存储”: 它返回一些错误,主要问题是 然后我试图像这样追加DataFrame: 那应该创建一个表,但这给了我另一个错误: 所以我需要的代码将数据帧存储在一个表中HDF

  • 问题内容: 摘要:这不起作用: 但是这样做: 为什么? 再生产: 这不起作用: 但是这样做: 链接到笔记本 我的问题是: 为什么只有第二种方式起作用?我似乎看不到选择/索引逻辑的差异。 版本是0.10.0 编辑:这不应该再这样了。从0.11版开始,提供。参见此处:http : //pandas.pydata.org/pandas- docs/stable/indexing.html 问题答案: 大

  • 问题内容: 我有3个CSV文件。每个人都有第一列作为人物的(字符串)名称,而每个数据框中的所有其他列都是该人物的属性。 如何将所有三个CSV文档“连接”在一起以创建单个CSV,并且每一行都具有该人的字符串名称的每个唯一值的所有属性? 中的函数指定我需要一个多索引,但是我对层次化索引方案与基于单个索引进行联接有何关系感到困惑。 问题答案: 假设进口: John Galt的答案基本上是一项手术。如果我

  • 问题内容: 我有两张桌子。一个(下面的df)大约有18,000行,另一个(下面的映射文件)大约有80万行。我需要一个可以与如此大的DataFrames一起使用的解决方案。 这是一个玩具示例:表1-df 表2-映射文件 我正在尝试执行以下操作(我的语法是错误的,但是我认为这个想法会出现): 换句话说:我需要遍历mapfile中的每个项目(行),看看它的位置是否在df中每个CHR的任何START和EN