2017-11-15 11 views
3

私は次のpandasデータフレームを持っています。各点は各クラスの 'n'クラス点と結合され、各組み合わせは0または1の値を持ちます。 今度は各点について、最も高い数の '0'を持つクラスを取得したいと思います。 出力: Pt.1 - a Pt.2 -bpandasデータフレームのクエリステートメントを使用して列を選択

私はハッシュテーブルで試しましたが、少し面倒です。これに対するエレガントなパンダのデータフレームのクエリは何ができますか?

+------+-------+-------+--+--+--+ 
| Pt. | class | value | | | | 
+------+-------+-------+--+--+--+ 
| Pt.1 | a  |  0 | | | | 
| Pt.1 | a  |  0 | | | | 
| Pt.1 | a  |  1 | | | | 
| Pt.1 | b  |  0 | | | | 
| Pt.1 | b  |  1 | | | | 
| pt.1 | b  |  1 | | | | 
| Pt.2 | a  |  1 | | | | 
| Pt.2 | a  |  1 | | | | 
| Pt.2 | a  |  1 | | | | 
| Pt.2 | b  |  0 | | | | 
| Pt.2 | b  |  0 | | | | 
| Pt.2 | b  |  0 | | | | 
|  |  |  | | | | 
+------+-------+-------+--+--+--+ 
+0

ここに「r」タグがあるのはなぜですか? – Sotos

+0

rとpythonのデータフレーム操作が似ているので –

答えて

1
boolean indexingによってのみ 0行と、出力をソート value_countsgroupbyによってカウント

第一のフィルタので、索引付けすることにより、第1 index値seelct必要がある:フィルタリングのquery

df = (df[df['value'] == 0].groupby('Pt.')['class'] 
          .apply(lambda x: x.value_counts().index[0]) 
          .reset_index(name='top1')) 
print (df) 
    Pt. top1 
0 Pt.1 a 
1 Pt.2 b 

同様の代替:

df = (df.query("value == 0") 
     .groupby('Pt.')['class'] 
     .apply(lambda x: x.value_counts().index[0]) 
     .reset_index(name='top1')) 
print (df) 
    Pt. top1 
0 Pt.1 a 
1 Pt.2 b 
+0

ありがとう!完璧に働いた! –

関連する問題