IP归属的4种查询方法

题目要求:随机生成10个电话号码,在号码归属表中查询其对应归属地信息

号码归属表部分显示:

号码段归属地省份归属地城市卡类型区号邮政编码
1300000山东济南市山东联通130卡531250000
1300001江苏常州市江苏联通130卡519213000
1300002安徽巢湖市安徽联通130卡565238000
1300003四川宜宾四川联通130卡831644000

期望得到结果如下:

 号码归属地省份归属地城市卡类型区号邮政编码
015269532161山东烟台市山东移动GSM卡535264000
113914862190江苏徐州市江苏移动GSM卡516221000
213185737454浙江嘉兴市浙江联通GSM卡573314000
315290688450河南周口市河南移动GSM卡394466000
413207301620湖南岳阳市湖南联通GSM卡730414000
518843924713吉林白山市吉林移动188卡439134300
613359099817安徽黄山市安徽电信CDMA卡559242700
718931736956河北沧州市河北电信CDMA卡31761000
818620973590广东广州市广东联通GSM卡20510000
915682836801甘肃兰州市甘肃联通GSM卡931730000

思路1:循环

#导入包

import pandas as pd
import random

#读入号码归属.csv
df=pd.read_csv(r'C:\Users\Desktop\号码归属.csv',engine='python')


def createPhone():
    phones=[]
    for k in range(10):
        prelist=["130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
                 "147", "150", "151", "152", "153", "155", "156", "157", "158", "159",
                 "186", "187", "188", "189"]
        tel=random.choice(prelist)+"".join(random.choice("0123456789") for i in range(8))
        phones.append(tel)
    return phones

def GetphoneGuishudi(tel):   
    for i in range(0,len(df)): 
        if eval(tel[:7])==df.iloc[i]['号码段']:
            return [tel,df.iloc[i]['归属地省份'],df.iloc[i]['归属地城市'],df.iloc[i]['卡类型']]
            
    else:
        return [tel,'','','']
    

phones=createPhone()
#print(phones)
alldata=[]
for tel in phones:
    alldata.append(GetphoneGuishudi(tel))


dfres1=pd.DataFrame(alldata,columns=['号码','归属地省份','归属地城市','卡类型'])

dfres1.to_csv(r'C:\UsersDesktop\号码归属地查询结果.csv',encoding='gbk')

2、二分法

import pandas as pd
import random

df=pd.read_csv(r'C:\Users\Desktop\号码归属.csv',engine='python')

def createPhone():
    phones=[]
    for k in range(10):
        prelist=["130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "153", "155", "156", "157", "158", "159","186", "187", "188", "189"]
        phone=random.choice(prelist)+"".join(random.choice("0123456789") for i in range(8))
        phones.append(phone)
    return phones
         
def BinarySearch(phone, df):
    try:
        df= df.reset_index(drop=True)
        
        # 记录最大最小
        min = 0
        max = df.shape[0]
        center = int((min + max) / 2)
        row=df.loc[int((min + max) / 2)]
        
        if int(phone[:7])==row['号码段']:
            return [phone,row['号码段'],row['归属地省份'],row['归属地城市']]
        elif int(phone[:7])>row['号码段']:
            df=df[int((min + max) / 2):max]
            return  BinarySearch(phone,df)
        elif int(phone[:7])<row['号码段']:
            df=df[0:int((min + max) / 2)]
            return  BinarySearch(phone,df)
        else:
            return [phone,'','','']
            
                                                     
    except:
        return [phone,'','','']

phones=createPhone()

data=[]
for phone in phones:
    data.append(BinarySearch(phone,df))

dfres1=pd.DataFrame(data,columns=['号码','归属地省份','归属地城市','卡类型'])

dfres1.to_csv(r'C:\Users\Desktop\号码归属地查询结果2.csv',encoding='gbk')

3、pandas.merge方法

import pandas as pd
import random

df=pd.read_csv(r'C:\Users\Desktop\号码归属.csv',engine='python')

def createPhone():
    phones=[]
    for k in range(10):
        prelist=["130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "153", "155", "156", "157", "158", "159","186", "187", "188", "189"]
        phone=random.choice(prelist)+"".join(random.choice("0123456789") for i in range(8))
        subphone=phone[:7]
        phones.append([int(phone),int(subphone)])
    return phones
    
        
phones=createPhone()


df_phones=pd.DataFrame(phones,columns=['号码','号码段1'])

dfres1=pd.merge(df_phones,df,how='left',left_on=['号码段1'],right_on=['号码段'])
dfres2=dfres1.loc[:,['号码','归属地省份','归属地城市','卡类型','区号','邮政编码']]


dfres2.to_csv(r'C:\Users\Desktop\号码归属地查询结果2.csv',encoding='gbk')

4、pandasql pandas数据库查询方法

import pandas as pd
from pandasql import *
import random

df=pd.read_csv(r'C:\Users\Desktop\号码归属.csv',engine='python')

def createPhone():
    phones=[]
    for k in range(10):
        prelist=["130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "153", "155", "156", "157", "158", "159","186", "187", "188", "189"]
        phone=random.choice(prelist)+"".join(random.choice("0123456789") for i in range(8))
        phones.append([int(phone),int(phone[:7])])
                       
    return phones

phones_df=pd.DataFrame(createPhone(),columns=['号码','号码段'])

q="select m.号码段,df.归属地省份 from phones_df m left join df on m.'号码段'= df.'号码段'"

dfres=sqldf(q)

print(type(dfres))

dfres.to_csv(r'C:\Users\Desktop\号码归属地查询结果4.csv',encoding='gbk')

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值