2017-05-15 5 views
1

をグループ化し、同じ値を持つ別の列によって周波数の列を並べ替えます。パンダ:私は<strong>Y列</strong>により基であり、<strong>Y列</strong>のそれら<strong>カウントカラム</strong>でソートデータフレームをした

コード:

df['count'] = df.groupby(['y'])['y'].transform(pd.Series.value_counts) 
df = df.sort('count', ascending=False) 

出力:今

x y count 
1 a 4 
3 a 4 
2 a 4 
1 a 4 
2 c 3 
1 c 3 
2 c 3 
2 b 2 
1 b 2 

、私は以下のようなY列にグループ化された同じ値を持つその周波数にのx列をソートしたいです:

予想される出力:

x y count 
1 a 4 
1 a 4 
2 a 4 
3 a 4 
2 c 3 
2 c 3 
1 c 3 
2 b 2 
1 b 2 
+0

列xをソートする試みはありますか? – Satyadev

+0

@Satyadev:私は試しましたが、私は初心者ではありませんでした。 – iNikkz

答えて

1

あなたがgroupbyvalue_countsを必要とし、その後numpy.repeatためDataFrameに自分のカウントでインデックス値を展開するようだ:

s = df.groupby('y', sort=False)['x'].value_counts() 
#alternative 
#s = df.groupby('y', sort=False)['x'].apply(pd.Series.value_counts) 
print (s) 
y x 
a 1 2 
    2 1 
    3 1 
c 2 2 
    1 1 
b 1 1 
    2 1 
Name: x, dtype: int64 

df1 = pd.DataFrame(np.repeat(s.index.values, s.values).tolist(), columns=['y','x']) 
#change order of columns 
df1 = df1.reindex_axis(['x','y'], axis=1) 
print (df1) 
    x y 
0 1 a 
1 1 a 
2 2 a 
3 3 a 
4 2 c 
5 2 c 
6 1 c 
7 1 b 
8 2 b 
+0

@jezrel:申し訳ありませんが、私は間違いを犯しました。だから、私は私の質問を編集しました。 "カウント"列はソートの能力を失うことはありません。常にソートする必要があります。 – iNikkz

+0

OKですが、最初の列はOKですか?最初のグループでは、 'a'は' c'でソートされ、 'b'はソートされません。 – jezrael

+0

実際には、** c **と** b **は頻度でソートされています。ご覧のとおり、** c **列には2 ** 2 **と** 1 ** **があり、** b **には** 2 **と** 1 **があります。 – iNikkz

1

古いバージョンのdfを使用している場合.sort_valuesはサポートされていません。

df.sort(columns=['count','x'], ascending=[False,True]) 
+0

申し訳ありませんが、私は間違いを犯しました。だから、私は私の質問を編集しました。 "カウント"列はソートの能力を失うことはありません。常にソートする必要があります。 – iNikkz

+0

私はあなたの問題を理解しているかわかりません。では、今は何がうまくいかないのですか? – Allen

+0

** x **列は、** y **および** count **列の並べ替えに影響を与えずに並べ替える必要があります。 ** ** y **と** count **の列を並べ替えることなく** x **列をソート – iNikkz

関連する問題

 関連する問題