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'])
我有一个包含 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'])