Python:另一个数据帧中另外两列之间的查找值

时间:2016-11-01 02:00:57

标签: python dataframe type-conversion between

我有一个包含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;之间。作为运营商。谢谢。

2 个答案:

答案 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'])