问题 将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]})

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

mydf.groupby("class").val.sum()

这是正确的行为,但我想保留 cat 结果df中的列信息。可以这样做吗?我一定要吗 merge/join 以后的那些信息?我试过了:

mydf.groupby(["cat", "class"]).val.sum()

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

cat     class    val
first   A         7
second  B         3
third   C        10

这可能吗?


6770
2018-01-21 02:25


起源

你能举例说明你想要的输出吗? - BrenBarn
@BrenBarn:刚添加它 - user248237dfsf


答案:


使用 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

编辑

如果要设置,则设置级别= 1 cat 作为索引

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

你也可以设置 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

14
2018-01-21 02:33



可能想用 reset_index(level=1),因为在示例输出中看起来他确实想要 cat 作为指数(只是没有 cat  和 类)。看起来这个数据有些奇怪 cat 和 class 冗余地提供相同的信息。 - BrenBarn
美丽我总是忘记这个有用的功能! - user248237dfsf
谢谢@BrenBarn,我已经更新了答案 - waitingkuo
as_index = False是绕过reset_index位的另一种方法。 - Andy Hayden
谢谢@AndyHayden,我已经更新了答案 - waitingkuo