这是我拥有的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
答案 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]]