我搜索过并发现了有关这个一般主题的其他问题,但我找不到这个具体问题的答案。
我有一个数据框,通过将几个数据框附加在一起,然后是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' - 我需要在日期组内排序。
有人可以建议解决方案吗?
答案 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