【问题标题】:grouping pandas dataframe by two columns (or more)?按两列(或更多)分组熊猫数据框?
【发布时间】:2014-01-21 11:01:14
【问题描述】:

我有以下数据框:

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]})

我想创建一个数据框,对具有相同 class id 的项目的 val 列进行汇总统计。为此,我使用groupby 如下:

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

这是正确的行为,但我想在结果 df 中保留 cat 列信息。可以吗?我以后必须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

这可能吗?

【问题讨论】:

  • 你能举例说明你希望你的输出是什么吗?
  • @BrenBarn:刚刚添加了它

标签: python pandas dataframe


【解决方案1】:

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

编辑

如果要将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

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

【讨论】:

  • 可能想要使用reset_index(level=1),因为在示例输出中,他看起来确实想要cat 作为索引(只是不是cat 和 类)。这个数据有点奇怪,因为 cat 和 class 似乎冗余地提供了相同的信息。
  • 漂亮我总是忘记这个有用的功能!
  • as_index=False 是绕过 reset_index 位的另一种方法。
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 2017-07-08
  • 2022-01-07
  • 2018-06-03
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
相关资源
最近更新 更多