2016-10-31 7 views
1

次の問題を解決しようとしています。パンダ:サブグループ内のデータフレームをソートし、等しい値をソートする問題

df = pd.DataFrame({'A': ['id1', 'id1', 'id2', 'id2', 'id2','id2', 'id2', 'id2','id2', 'id3', 'id3', 'id3'] , 
        'B': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] , 
       'C': [101 , 32, 10, 9, 15, 15, 15, 15, 15, 40, 36, 36]}) 
df 

Out[16]: 
     A B C 
0 id1 10 101 
1 id1 11 32 
2 id2 12 10 
3 id2 13 9 
4 id2 14 15 
5 id2 15 15 
6 id2 16 15 
7 id2 17 15 
8 id2 18 15 
9 id3 19 40 
10 id3 20 36 
11 id3 21 36 

私は今カラムCの値をカラムAのID値によって定義された各サブグループの昇順にソートされるように、データフレームを再配置したい: は、私は、次のデータフレームdfを有します。私は以下のコードを使用します。

df2 = df 
df2 = df2.sort_values(by=['A','C'], ascending=True).groupby('A').head() 

をし、私はこれを取得:

df2 
Out[18]: 
     A B C 
1 id1 11 32 
0 id1 10 101 
3 id2 13 9 
2 id2 12 10 
4 id2 14 15 
5 id2 15 15 
6 id2 16 15 
10 id3 20 36 
11 id3 21 36 
9 id3 19 40 

すべて正しくソートされているA COL内のサブグループid1に対応するCの値だけでなく、それらの値をサブグループid3に対応します。しかし、COL Aid2に対するCOL Cのソート操作は2つの行が...スキップした

print len(df.index), len(df2.index) 
12 10 

任意のアイデアは、なぜこれが起こるんし、どのようにこの問題を解決するために? 何か助けていただければ幸いです。

おかげで、 MarcoCのでご.groupby('A').head()

+0

'head()'は、デフォルトでトップ5の値を取得します。 – Jarad

+0

ありがとう@ジャラド。確かに、それは間違いです。 – MarcoC

答えて

1

私はあなただけDataFrame.sort_valuesが必要だと思う:

df2=df.sort_values(by=['A','C'], ascending=True) 
print (df2) 
     A B C 
1 id1 11 32 
0 id1 10 101 
3 id2 13 9 
2 id2 12 10 
4 id2 14 15 
5 id2 15 15 
6 id2 16 15 
7 id2 17 15 
8 id2 18 15 
10 id3 20 36 
11 id3 21 36 
9 id3 19 40 

そして、あなたデフォルトhead(5)であるため、行を削除 - グループごと5行を先頭にのみ取得します。

+0

@jezraelありがとうございます。ソートコマンドは最初は間違っていて、 'groupby'する必要はなく、' head() 'は必要ありませんでした。 – MarcoC

2

.headは、DataFrameの最初の5行を表示するだけです。グループ 'id2'の最初の5行だけを返します。 .headを削除し、あなたは正しい答えを得るでしょう:

df2 = df2.sort_values(by=['A','C'], ascending=True).groupby('A') # Note, no .head() 
print len(df.index), len(df2.index) 
12 12 
+0

ありがとう@Kartik – MarcoC