如何强制为数据框中具有除数字以外的任何字符串或字符的行留空?
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('')
我有一个数据框
>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('')