将pandas数据帧分组为两列(或更多)?

11 python dataframe pandas

我有以下数据帧:

mydf = pandas.DataFrame({"cat": ["first", "first", "first", "second", "second", "third"], "class": ["A", "A", "A", "B", "B", "C"], "name": ["a1", "a2", "a3", "b1", "b2", "c1"], "val": [1,5,1,1,2,10]})
Run Code Online (Sandbox Code Playgroud)

我想创建一个数据框,该数据框生成有关val具有相同classID 的项列的摘要统计信息.为此,我使用groupby如下:

mydf.groupby("class").val.sum()
Run Code Online (Sandbox Code Playgroud)

这是正确的行为,但我想cat在生成的df中保留列信息.可以这样做吗?我以后要merge/join知道这些信息吗?我试过了:

mydf.groupby(["cat", "class"]).val.sum()
Run Code Online (Sandbox Code Playgroud)

但这使用分层索引.我希望有一个简单的数据帧,只有cat每个组的值,其中group by class.输出应该是具有cat和class值的数据框(不是系列),其中val条目在每个具有相同条目的条目上求和class:

cat     class    val
first   A         7
second  B         3
third   C        10
Run Code Online (Sandbox Code Playgroud)

这可能吗?

wai*_*kuo 14

使用 reset_index

In [9]: mydf.groupby(['cat', "class"]).val.sum().reset_index()
Out[9]: 
      cat class  val
0   first     A    7
1  second     B    3
2   third     C   10
Run Code Online (Sandbox Code Playgroud)

编辑

如果要设置cat为索引,则设置level = 1

In [10]: mydf.groupby(['cat', "class"]).val.sum().reset_index(level=1)
Out[10]: 
       class  val
cat              
first      A    7
second     B    3
third      C   10
Run Code Online (Sandbox Code Playgroud)

您也可以设置as_index=False为获得相同的输出

In [29]: mydf.groupby(['cat', "class"], as_index=False).val.sum()
Out[29]: 
      cat class  val
0   first     A    7
1  second     B    3
2   third     C   10
Run Code Online (Sandbox Code Playgroud)

  • as_index = False是绕过reset_index位的另一种方法. (2认同)