按分组DataFrame

时间:2017-08-02 20:01:19

标签: pandas sorting

我搜索过并发现了有关这个一般主题的其他问题,但我找不到这个具体问题的答案。

我有一个数据框,通过将几个数据框附加在一起,然后是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'组'是一个小例子,显示了我迄今为止的相同结构。实际上,每个日期组中都会有大量的行。

我想对分组的DataFrame' group'进行排序。通过colum中的值C_mean' - 但是在第一列'日期'中的组内排序。排序应该是下降。

因此,如果我们在列中查看两个值,那么C_mean'在小组' 1-1' 2017'中,我们会看到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' - 我需要在日期组内排序。

有人可以建议解决方案吗?

1 个答案:

答案 0 :(得分:2)

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

首先将索引复制到新列

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