通过Pandas列搜索值

时间:2018-02-14 12:01:13

标签: python pandas

这是我拥有的pandas数据帧的示例。我需要找到给定出价的特定行。例如,给bid = 5,我需要返回与下表中对应的行。如果我输入缺失的出价,例如,bid = 6,那么应该返回对应于小于输入出价的最大出价的行。因此,在这种情况下应该返回对应于bid = 5的行。我怎么在熊猫中做到这一点?

Bid Imp Click   Spend
3   13  0.97    2
4   13  1.89    7
5   79  34.98   130
7   83  37.52   140
8   88  38.52   144

3 个答案:

答案 0 :(得分:2)

我认为这可以解决问题:

>>> df[(df['Bid']<=5)].iloc[-1,:]

Bid        5.00
Imp       79.00
Click     34.98
Spend    130.00
Name: 2, dtype: float64

如果你想要一只熊猫,只需df[(df['Bid']<=5)].iloc[-1,:].to_frame().T

>>> df[(df['Bid']<=5)].iloc[-1,:].to_frame().T
   Bid   Imp  Click  Spend
2  5.0  79.0  34.98  130.0

对于缺少出价= 6的情况,df[(df['Bid']<=6)].iloc[-1,:].to_frame().T会返回最接近6的出价,也就是5。

>>> df[(df['Bid']<=6)].iloc[-1,:].to_frame().T
   Bid   Imp  Click  Spend
2  5.0  79.0  34.98  130.0

<强> EDITED 要确保数据框按升序包含Bid,请执行以下操作:

>>> df = df.sort_values(by='Bid',ascending=True)

答案 1 :(得分:0)

尝试

def get_bid(val):
    # find the index of the maximum bid below or equal val
    index = df.loc[df.Bid <= val, 'Bid'].idxmax()
    return df.loc[[index]]

这是分别使用值6和5以及4调用函数的结果

In []: get_bid(6)
Out[]: 
   Bid  Imp  Click  Spend
2    5   79  34.98    130

In []: get_bid(5)
Out[]: 
   Bid  Imp  Click  Spend
2    5   79  34.98    130

In []: get_bid(4)
Out[]: 
   Bid  Imp  Click  Spend
1    4   13   1.89      7

PS如果您更喜欢一个衬垫,可以将代码更改为In [1],这将产生与上面相同的输出。即数据帧。删除双括号(在[2]中)会将输出更改为一系列。 I,E,

In [1]: val = 6
       df.loc[[df.loc[df.Bid <= val, 'Bid'].idxmax()]]
Out[1]: 
   Bid  Imp  Click  Spend
2    5   79  34.98    130

In [2]: df.loc[df.loc[df.Bid <= val, 'Bid'].idxmax()]
Out[2]: 
Bid        5.00
Imp       79.00
Click     34.98
Spend    130.00
Name: 2, dtype: float64

答案 2 :(得分:0)

这是一种基于生成器的方法。生成器耗尽,我们通过枚举捕获最后一项。

df = df.sort_values('Bids')
df.loc[df['Bid'] == [max(enumerate(i for i in df['Bid'] if i <= 6))[1]]]

   Bid  Imp  Click  Spend
2    5   79  34.98    130

对于小型数据帧,上述方法对于较大的,较慢的速度较慢。作为替代方案,您可以使用这个基于熊猫的解决方案:

df.iloc[df[df['Bid'] <= 6].index[-1]]