我有一个带有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,将“国家”作为新列添加到上述数据框中。
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
但是,这返回:
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”作为运算符。谢谢。
最佳答案
在这种情况下,应用是我通常的解决方案:
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)
可能有一个连接,合并或串联的解决方案,但是我认为这是解决问题的更明显的方法。
注意:此解决方案依赖于仅返回单个条目的条件。
关于python - Python:另一个数据框中其他两个列之间的查找值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40353143/