2017-05-15 96 views
1

我有數據幀是按ÿ柱和分類上ÿ柱計數列熊貓:按具有相同的值的另一列上的頻率列分組

代碼:

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 

現在,我想在其頻率排序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

好的,但第一列可以嗎?在第一組中,「a」被排序,在「c」中,而「b」不是。 – jezrael

+0

實際上,** c **和** b **按頻率排序。正如你可以看到** c **列有兩個** 2 **和一個** ** **,而** b **只有一個** 2 **和一個** ** **。 – iNikkz

1

如果您使用的是舊版本,其中DF .sort_values不受支持。你可以使用:

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

對不起,我犯了一個錯誤。所以,我編輯了我的問題。 「計數」欄不會丟失排序的能力。它應該總是排序。 – iNikkz

+0

我不確定我是否瞭解您的問題。那麼現在沒有工作? – Allen

+0

** x **列應該排序而不影響** y **和** count **列的排序。排序** x **列而不洗牌** ** **和**數**列 – iNikkz