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

pandas按组汇总和列排序

张璞
2023-03-14
问题内容

给定以下数据框

In [31]: rand = np.random.RandomState(1)
         df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 2,
                            'B': rand.randn(6),
                            'C': rand.rand(6) > .5})

In [32]: df
Out[32]:      A         B      C
         0  foo  1.624345  False
         1  bar -0.611756   True
         2  baz -0.528172  False
         3  foo -1.072969   True
         4  bar  0.865408  False
         5  baz -2.301539   True

我想A按的总和对分组()进行排序B,然后按C(不对)的值进行分组。所以基本上得到A组的顺序

In [28]: df.groupby('A').sum().sort('B')
Out[28]:             B  C
         A               
         baz -2.829710  1
         bar  0.253651  1
         foo  0.551377  1

然后通过对/错,最终看起来像这样:

In [30]: df.ix[[5, 2, 1, 4, 3, 0]]
Out[30]: A         B      C
    5  baz -2.301539   True
    2  baz -0.528172  False
    1  bar -0.611756   True
    4  bar  0.865408  False
    3  foo -1.072969   True
    0  foo  1.624345  False

如何才能做到这一点?


问题答案:

Groupby A:

In [0]: grp = df.groupby('A')

在每个组中,对B求和,然后使用transform广播值。然后按B排序:

In [1]: grp[['B']].transform(sum).sort('B')
Out[1]:
          B
2 -2.829710
5 -2.829710
1  0.253651
4  0.253651
0  0.551377
3  0.551377

通过从上方传递索引来索引原始df。这将按B值的总和对A值重新排序:

In [2]: sort1 = df.ix[grp[['B']].transform(sum).sort('B').index]

In [3]: sort1
Out[3]:
     A         B      C
2  baz -0.528172  False
5  baz -2.301539   True
1  bar -0.611756   True
4  bar  0.865408  False
0  foo  1.624345  False
3  foo -1.072969   True

最后,使用sort=False选项保留“ A”组中的“ C”值,以保留步骤1中的A排序顺序:

In [4]: f = lambda x: x.sort('C', ascending=False)

In [5]: sort2 = sort1.groupby('A', sort=False).apply(f)

In [6]: sort2
Out[6]:
         A         B      C
A
baz 5  baz -2.301539   True
    2  baz -0.528172  False
bar 1  bar -0.611756   True
    4  bar  0.865408  False
foo 3  foo -1.072969   True
    0  foo  1.624345  False

通过清理DF指数reset_indexdrop=True

In [7]: sort2.reset_index(0, drop=True)
Out[7]:
     A         B      C
5  baz -2.301539   True
2  baz -0.528172  False
1  bar -0.611756   True
4  bar  0.865408  False
3  foo -1.072969   True
0  foo  1.624345  False


 类似资料:
  • 本文向大家介绍java数组排列组合问题汇总,包括了java数组排列组合问题汇总的使用技巧和注意事项,需要的朋友参考一下 面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅: 1. 无重复元素的数组,求全排列; 2. 有重复元素的数组,求全排列; 3. 无重复元素的数组,求组合【子集】; 4. 有重复元素的数组,求组合; 以上四类题,可以用统一的模板实现,如下所示: 以

  • 我有一个Python Pandas数据帧。df有2列,我想按第二列对df进行排序。 我想按角度排序df(升序)。

  • 问题内容: 我正在使用此数据框: 我想按名称然后按水果进行汇总,以获得每个名称的水果总数。 我尝试按名称和水果分组,但如何获取水果总数。 问题答案: 使用方法

  • 问题内容: 这应该很简单,但是让我受益匪浅。 我所拥有的只是一个只有两列的表格,如下所示: 等等。 我想计算 每天 的 总字数 -我将它们按日期添加分组并选择WordCount的总和,最后得到语法错误(wordcount必须在group by子句中),但是现在我得到的天数为null 这是我的查询: 这只是选择null。我怎么知道怎么了? 谢谢。 问题答案: 如果您使用该怎么办: 我不明白您为什么还

  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 问题内容: SQL查询是否可以返回一些常规列和一些聚合列? 喜欢 : 问题答案: 您应该使用group by语句。 GROUP BY语句与聚合函数结合使用,以按一个或多个列对结果集进行分组。 例如: 您可以在此处看到完整的示例。