2017-08-02 13 views
0

この一般的なトピックについて他の質問が検索されましたが、この特定の質問に対する回答が見つかりません。グループ化されたDataFrameのグループ内で1つの列を並べ替える

私はいくつかのデータフレームを一緒に追加して作成したデータフレームを持っており、それに続いて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列によって次に、I群、及び列「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'は、私が今までに持っていたのと同じ構造を示す小さな例です。実際には、各日付グループには多数の行があります。

グループ化されたDataFrame 'グループ'を列 'C_mean'の値でソートしたいが、最初の列 '日付'のグループ内でソートする。ソートは降順でなければなりません。

グループ '1-1'2017'の 'C_mean'列の2つの値を見ると、0.428637と0.279815が降順でソートされています。私はこれを達成するために見つけることができるすべてを試みたが、中にいる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 

- と同様に次の日のグループの2017年1月2日 "に、「C_mean」の値が降順にソートされますすべての場合、私は列C_mean全体の一種で終わった - 私は日付グループ内で並べ替える必要があります。

誰かが解決策を提案できますか?

答えて

0

私はこれに応答しませんでしたが、私は解決策を見つけました。それほどエレガントではありませんが、それは仕事を終えました。他の誰かが同様の問題を抱えている場合には、私はそれを投稿します。

新しい列にインデックス

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) 

を生成する第1のコピー追加された日付の列を削除する - 不要になる

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 
関連する問題