我有一个包含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
我想添加' country'通过查找下限和上限之间的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中,这是一个非常容易的联接,&#34;在&#34;之间。作为运营商。谢谢。
答案 0 :(得分:2)
应用 是我常用的解决方案:
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)
可能有一个连接,合并或连接解决方案,但我认为这是解决问题的更明显的方法。
注意:此解决方案依赖于仅返回单个条目的条件。
答案 1 :(得分:0)
以下是我最终使用的内容:
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'])