首页 > 解决方案 > 如何使用 for-looped print() 结果在 pandas 的数据框中填充新列?

问题描述

我创建了以下代码来将 df 的 phone_number 列连接到验证电话号码有效性的 api(使用“numverify”):

import urllib.parse
import requests

main_api = 'http://apilayer.net/api/validate?access_key=xxxx&'

number = file.phone_number
for n in number:

    phonenumber = urllib.parse.urlencode({'number': n})

    url = main_api + phonenumber + '&country_code=&format=1'

    numverify_data = requests.get(url).json()
    numverify_validity = numverify_data['valid']

    print(numverify_validity)

结果将是数据框中每个电话号码的 json 中的几个真假值。

我尝试用

file['numverify_validity'] = print(numverify_validity)

或者

file['numverify_validity'] = numverify_validity

但新列与打印结果不一致。

关于问题是什么的任何想法?

而且,如果您有其他验证电话号码的方法,那就太好了:)

ps 这是我在这里提出的第一个问题,所以如果您认为我使用的格式不方便,请告诉我。

标签: pythonpandasapi

解决方案


给定一个数据框file,您可以定义一个验证函数并将apply其添加到number列中:

def verify_number(n):
    phonenumber = urllib.parse.urlencode({'number': n})
    url = main_api + phonenumber + '&country_code=&format=1'
    numverify_data = requests.get(url).json()
    return numverify_data['valid']

file['numverify_validity'] = file.number.apply(verify_number)


可以使用phonenumbers(Google 的 libphonenumber 库的 Python 端口)进行离线电话号码验证:

import pandas as pd
import phonenumbers as pn

file = pd.DataFrame({'number': ['+442083661177', '+12001230101']})
file['numverify_validity'] = file.number.apply(lambda x: pn.is_valid_number(pn.parse(x)))

结果:

          number  numverify_validity
0  +442083661177                True
1   +12001230101               False


根据评论中的要求更新输入验证:

import phonenumbers as pn

while True:
    try:
        number = input('Phone number: ')
        if not pn.is_valid_number(pn.parse(number)):
            raise pn.NumberParseException(None, 'invalid number')
        break
    except pn.NumberParseException:
        print('Please enter a valid phone number.')

print(number)

推荐阅读