我正在尝试应用一个函数来检查一系列中存储的字符串是否为数字,如果是,则将它们转换为None,如果不执行任何操作。该系列如下:
0 'EUR'
1 '327'
2 'None'
3 'USD'
检查条目是否为表示为字符串的数字的函数:
def is_number(s):
try:
float(s)
return True
except (TypeError,ValueError):
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
def num_to_none(target):
if is_number(target):
target = None
我这样称呼函数:
result = mySeries.apply(num_to_none)
但我得到res的以下结果:
0 'None'
1 'None'
2 'None'
3 'None'
期望的结果是:
0 'EUR'
1 'None'
2 'None'
3 'USD'
我目前正在测试环境中使用一个小型数据帧(10000行,70列),但我希望将它应用于更大的数据帧,如果我能使它工作,那么也欢迎效率建议。提前谢谢。
答案 0 :(得分:4)
您需要return
num_to_none
函数
def num_to_none(target):
if is_number(target):
target = None
return target
您的函数表现不正常的原因是因为如果没有return
语句,则默认行为为return None
def my_function():
print "hello world"
相当于
def my_function():
print "hello world"
return None
答案 1 :(得分:2)
您可以使用UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "variable"), &value)
和isnumeric
替代您的功能,即
where
答案 2 :(得分:1)
您可以to_numeric
使用errors='coerce'
:
m = pd.to_numeric(mySeries.str.strip("'"), errors='coerce').notnull()
result = mySeries.mask(m, "'None'")
print (result)
0 'EUR'
1 'None'
2 'None'
3 'USD'
Name: a, dtype: object