Python:另一个数据框中的其他两列之间的查找值

Python: Lookup value between two other columns in another dataframe

我有一个包含 IP 地址的数据框:

df_users.head(5)
    user_id ip_address
0   22058   7.327584e+08
1   333320  3.503114e+08
2   1359    2.621474e+09
3   150084  3.840542e+09
4   221365  4.155831e+08

我有一个查找数据框,其中 ip_address 作为低和高,映射到一个国家:

    df_ip.head(5)
    lower_bound_ip_address  upper_bound_ip_address  country
0   16777216.0  16777471    Australia
1   16777472.0  16777727    China
2   16777728.0  16778239    China
3   16778240.0  16779263    Australia
4   16779264.0  16781311    China

我想通过查找下限和上限之间的 ip_address 将 'country' 作为新列添加到上面的数据框中。

ip_data=df_fraud.ip_address.head(5)
k=[]
for i in range(len(ip_data)):
    ip=ip_data[i]
    tmp=df_ip[(df_ip['lower_bound_ip_address']<=ip) & (df_ip['upper_bound_ip_address']>=ip)]
    tmp=tmp['country'].tolist()
    k.append(tmp)
df_user['country']=k

然而这个returns:

user_id ip_address  country
0   22058   7.327584e+08    [Japan]
1   333320  3.503114e+08    [United States]
2   1359    2.621474e+09    [United States]
3   150084  3.840542e+09    []
4   221365  4.155831e+08    [United States]

国家/地区列中有这些括号。我在这里做错了什么?

有人知道我做错了什么吗?在 SQL 中,使用 "between" 作为运算符,这是一个非常简单的连接。谢谢。

apply 是我在这种情况下通常采用的解决方案:

def lookup_country(ip):

    return df_ip[(df_ip['lower_bound_ip_address']<ip) & (df_ip['upper_bound_ip_address']>=ip)]['country']

df_users['country'] = df_users.apply(lambda row: lookup_country(row['ip_address']), axis=1)

可能有连接、合并或连接解决方​​案,但我认为这是解决问题的更明显的方法。

注意:此解决方案依赖于仅返回单个条目的条件。

这是我最终使用的:

k=[]
for i in range(len(ip_data)):
    ip=ip_data[i]
    tmp=df_ip[(df_ip['lower_bound_ip_address']<=ip) & (df_ip['upper_bound_ip_address']>=ip)]['country'].tolist()
    k.extend(tmp if tmp else ['NULL'])