选择在熊猫中应用复杂creteria的最小值

时间:2017-05-12 19:43:18

标签: python pandas

我有一个难以解释的问题。我想比较同一辆车的车型,但我有三个标准:

首先:我想比较基线与同一辆车的不同型号。在我的数据集中,基线表示Car = Model。例如,在这种情况下,前三个观测值是基线,也是第6,第7和第8个观测值

第二:我对将BMW X5与另一辆BMW X5或X6进行比较并不感兴趣,并且彼此也有基线

第三:我正在进行哪种速度测试并不重要。例如,我可以将观察的speed_test_1与观察的speed_test_3进行比较

Forth:我想在不同的速度测试中得到最小的差异,不等于零

Index      Car         Model   Speed_test_1   Speed_test_2 Speed_test_3
0          BMW         BMW      13               23          14
1          BMW         BMW      23               29          27
2          BMW         BMW      12               23          45
3          BMW         X5       32               15          63
4          BMW         X5       35               23          23 
5          BMW         X6       33               24          14 
6          Fiat        Fiat     23               23          24
7          Fiat        Fiat     22               25          24
8          Fiat        Fiat     23               23          21
9          Fiat        P_2      28               29          30
10         Fiat        p_3      29               28          33

举一个例子:我获得菲亚特的最小距离是菲亚特(指数= 7; speed_test_2 = 25) - 菲亚特(指数= 9; speed_test_1 = 28)或者它可以是菲亚特(指数= 10; speed_test_2 = 28)。它可能是菲亚特(指数= 6:speed_test_1) - 菲亚特(指数= 7:speed_test_3)但请回想一下我没有比较基线

结果输出应如下所示:

Car    Baseline    min
BMW    BMW          1   
Fiat   Fiat         3

1 个答案:

答案 0 :(得分:0)

#define a function to find min diff according to the conditions listed in the question.
def find_min(x):
    base = x.iloc[:,-3:].astype(float).values
    others = df.loc[(df.Car==min(x.Car))&(df.Model!=min(x.Model))].iloc[:,-3:].astype(float).values
    min_diff = np.min(np.where(abs(base[:,None]-others)==0, np.inf, abs(base[:,None]-others)))
    return min_diff

#apply the function to each Car-Model Baseline group to get non-0 mins.
df.loc[df.Car==df.Model].groupby(['Car','Model']).apply(lambda x: find_min(x))
Out[1405]: 
Car   Model
BMW   BMW      1.0
Fiat  Fiat     3.0