2017-01-26 3 views
2
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'] 
+2

опубликуйте свой dataframe как текст вместо iages и что такое ошибка – e4c5

+0

TypeError: len() из несезонного объекта –

+0

опубликуйте свой файл данных как текст вместо изображений – e4c5

ответ

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'] 

Это предполагает, что ДФ список словарей. Это добавит страну в каждый словарь, если число попадает в правильный диапазон.

+0

спасибо, я перевариваю код. –

+0

Я запустил код, это дает мне ошибку. TypeError: строковые индексы должны быть целыми числами –

+0

Ох .... Я думаю, что сделал тип. – Geoff

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'] 

В чем разница с ответом Джеффа и этим?

2

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

b = df1.values[:, :2].ravel() 
c = df1.country.values 
ip = df.ip_address.values 
srch = b.searchsorted(ip) // 2 
mask = (ip >= b[0]) & (ip <= b[-1]) 
df.loc[mask, 'country'] = c[srch[mask]] 
Смежные вопросы