如果满足条件,则选择具有MAX值的行

时间:2019-04-03 00:36:59

标签: python python-3.x pandas

我正在Python中使用Pandas并遇到麻烦。我有一个带有索引和2列的数据框:“ VIFFactor”和“ features”。

我试图从我的数据框中返回在“ VIFFactor”中具有最大值的“功能”记录,但该数字超过5。

这是我的代码:

我试图用max替换idsmax并得到“无法将dtyped [bool]数组与类型为[bool]的标量进行比较”。

vif3 = vif_test.loc[(vif_test['VIFFactor'] >= 5) & (vif_test['VIFFactor'].idxmax()), 'features']

因此,例如,从下面开始,我想返回HadCampaign,因为它是最高记录且超过5条,但我目前什么也没得到:


    VIFFactor   features
2   12.028754355028974  HadCampaign
22  11.98926492333954   DiscountedPrice
29  5.460195615389739   RatingsReceivedRank
30  4.59851607313422    SortOrder
19  3.0681452496804833  PreferredPartnerBadge
9   3.0554578279939815  PerkCustomerDropService
28  2.735597253984768   RatingsReceived
26  2.263922204962396   PriceRank

2 个答案:

答案 0 :(得分:0)

这不起作用,您应该查看max,您的第一个条件通过bool并且长度为len(df),但是idxmax仅返回index max值是一个值,因此,如果需要对数据帧进行切片,则需要至少传递两个长度相同的条件

 vif3 = vif_test.loc[(vif_test['VIFFactor'] >= 5) & (vif_test['VIFFactor'].max() == vif_test['VIFFactor']), 'features']

答案 1 :(得分:0)

分为两行可能更清楚:

vif_test = vif_test[vif_test.VIFFactor > 5].set_index('VIFFactor')
vif3 = vif_test.loc[max(vif_test.index), 'feature']

注意:max()通常可能比index.max()更快。在小型数据框上进行测试:

%timeit d.index.max()
34.3 µs ± 447 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

 %timeit max(d.index)
9.43 µs ± 143 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)