如何强制为数据框中具有除数字以外的任何字符串或字符的行留空?

How do I force a blank for rows in a dataframe that have any str or character apart from numerics?

我有一个数据框

>temp
    Age Rank PhoneNumber State City
    10   1    99-22344-1 Ga    abc
    15   12    No        Ma    xyz

对于列(Phone 数字),我想去除所有字符,例如 - 除非它们是完整的 phone 数字,并且如果它说“否”或除数字之外的任何单词,我想要它是一个空白。我该怎么做

我的尝试能够处理特殊字符,但不能处理像 'No'

这样的文字符号
temp['PhoneNumber '] = temp['PhoneNumber '].str.replace('[^\d]+', '')

期望的输出 df -

>temp
    Age Rank PhoneNumber State City
    10   1    99223441    Ga    abc
    15   12               Ma    xyz

这样就可以了。

import pandas as pd
import re

data = [
    [10, 1, '99-223344-1', 'GA', 'Abc'],
    [15, 12, "No", 'MA', 'Xyz']
]

df = pd.DataFrame(data, columns=['Age Rank PhoneNumber State City'.split()])
print(df)

def valphone(p):
    p = p['PhoneNumber']
    if re.match(r'[123456789-]+$', p):
        return p
    else:
        return ""

print(df['PhoneNumber'])
df['PhoneNumber'] = df['PhoneNumber'].apply(valphone, axis=1)
print(df)

输出:

  Age Rank  PhoneNumber State City
0  10    1  99-223344-1    GA  Abc
1  15   12           No    MA  Xyz
  Age Rank  PhoneNumber State City
0  10    1  99-223344-1    GA  Abc
1  15   12                 MA  Xyz

我不得不承认对此有点沮丧。我预计能够做到

df['PhoneNumber'] = df['PhoneNumber'].apply(valphone)

因为 df['PhoneNumber'] 应该 return 一个系列,并且 Series.apply 函数应该一次向我传递一个值。但是,这不是这里发生的事情,我不知道为什么。 df['PhoneNumber'] return 是 DataFrame 而不是 Series,所以我必须在函数内使用列引用。

因此,您可能需要做一些实验。如果 df['PhoneNumber'] return 是适合您的系列,那么您不需要 axis=1,也不需要函数中的 p = p['PhoneNumber'] 行。

跟进

好的,假设存在“phone 号码验证”模块,如评论中所述,这将变为:

import phonenumbers
...
def valphone(p):
    p = p['PhoneNumber'] # May not be required
    n = phonenumbmers.parse(p)
    if phonenumbers.is_possible_number(n):
        return p
    else:
        return ''
...
temp['PhoneNumber'] = temp['PhoneNumber'].apply(str).str.findall(r'\d').str.join('')