Python 在特定列的dataframe中搜索值

Python 在特定列的dataframe中搜索值,python,pandas,Python,Pandas,对于输入,如name aartinid和ltp 1014 我希望输出为对应于ltp下限的url 在这种情况下 https://kite.zerodha.com/chart/ext/tvc/NFO-OPT/aartinind21jun1020ce/13192450 我正试图写函数来实现这一点,我被困在这里,无法思考应该是什么 将返回正确url的搜索条件 def find_url(name,ltp,df): return(df.iloc[df.index == name, ???) na

对于输入,如
name aartinid
ltp 1014
我希望输出为对应于ltp下限的
url

在这种情况下
https://kite.zerodha.com/chart/ext/tvc/NFO-OPT/aartinind21jun1020ce/13192450

我正试图写函数来实现这一点,我被困在这里,无法思考应该是什么 将返回正确url的搜索条件

def find_url(name,ltp,df):
    return(df.iloc[df.index == name, ???)


name        strike      url
AARTIIND    1000    https: // kite.zerodha.com/chart/ext/tvc/NFO-OPT/AARTIIND21JUN1000CE/13190658
AARTIIND    1020    https: // kite.zerodha.com/chart/ext/tvc/NFO-OPT/AARTIIND21JUN1020CE/13192450
AARTIIND    1040    https: // kite.zerodha.com/chart/ext/tvc/NFO-OPT/AARTIIND21JUN1040CE/13201410
AARTIIND    1060    https: // kite.zerodha.com/chart/ext/tvc/NFO-OPT/AARTIIND21JUN1060CE/13202434

如何获得所需结果?

要找到最接近的值,请将
ltp
减去
strike
,然后计算绝对值。最低值是最接近的值

试试这个:

def find_url(name, ltp, df):
    df1 = df.loc[df["name"] == name]
    return df1.loc[df1["strike"].sub(ltp).abs().idxmin(), "url"]

url = find_url("AARTIIND", 1014, df)
编辑

>>> pd.DataFrame({'df["strike"]': df["strike"],
                  ".sub(ltp)": df["strike"].sub(ltp),
                  ".abs()": df["strike"].sub(ltp).abs()})

   df["strike"]  .sub(ltp)  .abs()
0          1000        -14      14
1          1020          6       6  # idxmin() return 1 (6 == the lowest value)
2          1040         26      26
3          1060         46      46

ltp
(1014)的下限不应该是1000而不是1020?或者您想要上限或最接近的值。我想要最接近的值获取此错误类型错误:不支持的操作数类型为-:“str”和“int”
strike
列的数据类型不是数字?请提供
df.info()。请看我答案的第一行。@AkshadPatil。我更新了我的答案。
>>> pd.DataFrame({'df["strike"]': df["strike"],
                  ".sub(ltp)": df["strike"].sub(ltp),
                  ".abs()": df["strike"].sub(ltp).abs()})

   df["strike"]  .sub(ltp)  .abs()
0          1000        -14      14
1          1020          6       6  # idxmin() return 1 (6 == the lowest value)
2          1040         26      26
3          1060         46      46