在pandas数据帧中过滤倍数

时间:2016-07-04 15:55:14

标签: pandas dataframe filter

我的数据可以很容易地转换为类似于:

的pandas数据框
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"中所有具有相同值的行。列,但保持一行中"距离"中的最小值。柱。在这种情况下,我想删除所有具有"距离"大于200,因此,在此示例中,仅保留索引为0,1,8,9,16,17的行。最后所有的行应该有不同的" 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

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

groupby col上

b并在idxmin列上致电distance以对orig df进行索引:

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

答案 1 :(得分: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


​