【问题标题】:Sorting by one column within the groups of a grouped DataFrame按分组 DataFrame 的组中的一列排序
【发布时间】:2017-08-11 03:16:40
【问题描述】:

我已搜索并找到有关此一般主题的其他问题,但找不到此特定问题的答案。

我有一个通过将几个数据帧附加在一起创建的数据帧,然后是 groupby 和 agg 过程。

我在下面构建了一个示例数据框,只需按照流程进行即可。

# constructing an example dataframe
import numpy as np
import pandas as pd

rand = np.random.RandomState(1)

df1 = pd.DataFrame({'B': ['subgroup1'] * 6,})
df2 = pd.DataFrame({'B': ['subgroup2'] * 6,})
df2['date'] = '1-1-2017'
df2['C'] = rand.rand(6)

df3 = pd.DataFrame({'B': ['subgroup1'] * 6,})
df3['date'] = '1-2-2017'
df3['C'] = rand.rand(6)

df4 = pd.DataFrame({'B': ['subgroup2'] * 6,})
df4['date'] = '1-2-2017'
df4['C'] = rand.rand(6)

df5 = df1.append(df2)
df6 = df5.append(df3)
df7 = df6.append(df4)
print df7

           B      date         C
0  subgroup1  1-1-2017  0.417022
1  subgroup1  1-1-2017  0.720324
2  subgroup1  1-1-2017  0.000114
3  subgroup1  1-1-2017  0.302333
4  subgroup1  1-1-2017  0.146756
5  subgroup1  1-1-2017  0.092339
0  subgroup2  1-1-2017  0.186260
1  subgroup2  1-1-2017  0.345561
2  subgroup2  1-1-2017  0.396767
3  subgroup2  1-1-2017  0.538817
4  subgroup2  1-1-2017  0.419195
5  subgroup2  1-1-2017  0.685220
0  subgroup1  1-2-2017  0.204452
1  subgroup1  1-2-2017  0.878117
2  subgroup1  1-2-2017  0.027388
3  subgroup1  1-2-2017  0.670468
4  subgroup1  1-2-2017  0.417305
5  subgroup1  1-2-2017  0.558690
0  subgroup2  1-2-2017  0.140387
1  subgroup2  1-2-2017  0.198101
2  subgroup2  1-2-2017  0.800745
3  subgroup2  1-2-2017  0.968262
4  subgroup2  1-2-2017  0.313424
5  subgroup2  1-2-2017  0.692323

接下来,我按 2 列分组,并添加一个由“C”列的平均值组成的新列,以及一个计算平均值的新列。

group = df7.groupby(['date', 'B'])['C'].agg({'num' : len, 'C_mean' : np.mean})
print group

                    num    C_mean
date     B                       
1-1-2017 subgroup1  6.0  0.279815
         subgroup2  6.0  0.428637
1-2-2017 subgroup1  6.0  0.459403
         subgroup2  6.0  0.518874

DataFrame 'group' 是一个小例子,展示了我目前拥有的相同结构。实际上,每个日期组中都会有大量的行。

我想按列“C_mean”中的值对分组的DataFrame“组”进行排序——但在第一列“日期”的组内排序。排序应该是降序的。

因此,如果我们查看组 '1-1'2017' 中的列 'C_mean' 中的两个值,我们会看到 0.428637 和 0.279815 降序排序。同样在下一个日期组“1-2-2017”中,“C_mean”中的值将按降序排序——0.518874 和 0.459403

                    num    C_mean
date     B                       
1-1-2017 subgroup1  6.0  0.428637
         subgroup2  6.0  0.279815
1-2-2017 subgroup1  6.0  0.518874
         subgroup2  6.0  0.459403

我已经尝试了所有我能找到的方法来实现这一点,但在每种情况下,我都得到了整个列“C_mean”的排序——我需要在日期组中进行排序。

有人可以提出解决方案吗?

【问题讨论】:

    标签: pandas sorting


    【解决方案1】:

    我没有得到任何回应,但我确实找到了解决方案。不是很优雅,但它完成了工作。我会发布它以防其他人有类似的问题。

    先将索引复制到新列

    group['date'] = group.index
    

    然后按新列和“C_mean”列排序

    group = group.sort_values(['date', 'C_mean'], ascending=[True, False])
    

    这会产生所需的结果

                        num    C_mean                   date
    date     B                                              
    1-1-2017 subgroup1  6.0  0.279815  (1-1-2017, subgroup1)
             subgroup2  6.0  0.428637  (1-1-2017, subgroup2)
    1-2-2017 subgroup1  6.0  0.459403  (1-2-2017, subgroup1)
             subgroup2  6.0  0.518874  (1-2-2017, subgroup2)
    

    删除添加的日期列 -- 不再需要

    del group['date']
    
                        num    C_mean
    date     B                       
    1-1-2017 subgroup1  6.0  0.279815
             subgroup2  6.0  0.428637
    1-2-2017 subgroup1  6.0  0.459403
             subgroup2  6.0  0.518874
    

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2014-06-17
      • 2011-07-04
      • 1970-01-01
      • 2014-07-24
      相关资源
      最近更新 更多