根据变量范围合并行

时间:2017-01-26 03:42:41

标签: python pandas merge

df1:
 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

df: 
     ip_address
0    7.327584e+08
1    3.503114e+08
2    2.621474e+09
3    3.840542e+09
4    4.155831e+08
5    2.809315e+09
6    3.987484e+09
7    1.692459e+09
8    3.719094e+09
9    3.416747e+08

我是python的新手。 我想将df ['ip_address']与df1 ['country']匹配。某些ip_address范围对应于特定国家/地区,例如:729808896-734003199表示日本。怎么做?

我写了下面的代码,但是有错误。 TypeError:未确定对象的len()

for x in df['ip_address']:
    if x<=df1['upper_bound_ip_address'] and x>=df1['lower_bound_ip_address']:
        df['country']=df1['country']

3 个答案:

答案 0 :(得分:2)

<强> $arChoices = $this->em->getRepository('AppBundle:Area')->findByCountry($country);
pandas + pd.merge_asof

query

<强> pd.merge_asof( df.sort_values('ip_address'), df1, left_on='ip_address', right_on='lower_bound_ip_address' ).query('ip_address <= upper_bound_ip_address')[['ip_address', 'country']]
numpy

np.searchsorted

答案 1 :(得分:1)

我认为你要找的东西会更像这样......

for x in df['ip_address']:
    for y in df1:
        if x<=y['upper_bound_ip_address'] and x>=y['lower_bound_ip_address']:
            x['country']=y['country']

这是假设df是字典列表。如果数字落在正确的范围内,这将把国家/地区附加到每个字典。

答案 2 :(得分:1)

for x in range(0, len(df)):
    for y in range(0, len(df1)):
        if (df.iloc[x,'ip_address'] <= df1.iloc[y,'upper_bound_ip_address'] and (df.iloc[x,'ip_address'] >= df1.iloc[y,'lower_bound_ip_address']):
            df['country']=df1.iloc[y,'country']

@ Geoff的答案和这个答案有什么区别?