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']
答案 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的答案和这个答案有什么区别?