2016-07-04 2 views
1

私のデータを簡単のようになりますパンダのデータフレームに変換することができます。フィルタの倍数

import pandas as pd 
data={'a':["t", "g"]*9,'b' [1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6],'distance':[10, 15, 290, 300, 315, 320, 350, 360, 10, 25, 225, 240, 325, 335, 365, 205, 15, 35]} 
df=pd.DataFrame(data,columns=['a','b','distance']) 
print df 

    a b distance 
0 t 1  10 
1 g 2  15 
2 t 3  290 
3 g 4  300 
4 t 5  315 
5 g 6  320 
6 t 1  350 
7 g 2  360 
8 t 3  10 
9 g 4  25 
10 t 5  225 
11 g 6  240 
12 t 1  325 
13 g 2  335 
14 t 3  365 
15 g 4  205 
16 t 5  15 
17 g 6  35 

私は「B」列に同じ値を持つすべての行を消去したいが、 「距離」の列に最小値を持つ1行を保持します。この例では、この例では、インデックスが0,1,8,9,16,17の行だけが残るように、「距離」が200より大きいすべての行を消去したいと考えています。結局、すべての行は異なる "b"値と最小の "距離"を持たなければなりません。次のようになります。

a b distance 
0 t 1  10 
1 g 2  15 
2 t 3  10 
3 g 4  25 
4 t 5  15 
5 g 6  35 

どうすればいいですか? b COL上

答えて

2

groupbyとORIG DFインデックスにidxmindistanceの列を呼び出す:

ここ
In [114]: 
df.loc[df.groupby('b')['distance'].idxmin()] 

Out[114]: 
    a b distance 
0 t 1  10 
1 g 2  15 
8 t 3  10 
9 g 4  25 
16 t 5  15 
17 g 6  35 

あなたはidxmin戻り、最も低い値のインデックスをすることを見ることができます:

In [115]: 
df.groupby('b')['distance'].idxmin() 

Out[115]: 
b 
1  0 
2  1 
3  8 
4  9 
5 16 
6 17 
Name: distance, dtype: int64 
+0

ありがとうございます。それは非常にスマートな解決策です。 – Georg

+0

私の答えがあなたの質問を解決した場合、それを受け入れることができます。私の答えの左上に空の目盛りが表示されます – EdChum

0

はこれを試してみてください:

df.groupby('b')['a','b','distance'].min() 


#  a b distance 
# b     
# 1 t 1  10 
# 2 g 2  15 
# 3 t 3  10 
# 4 g 4  25 
# 5 t 5  15 
# 6 g 6  35 


​