1

我正在尝试应用一个函数来检查存储在一系列中的字符串是否是数字,如果是,则将它们变为无,如果不是则什么也不做。系列如下:

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 列)的测试环境中玩这个,但如果我能让它工作,我希望将它应用到更大的数据框,所以也欢迎效率建议。提前致谢。

4

3 回答 3

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
于 2017-12-01T10:20:45.790 回答
2

您可以使用isnumericandwhere作为您的替代功能,即

s.where(~s.str.isnumeric(),'None')
# or 
s.mask(s.str.isnumeric(),'None')

0     EUR
1    None
2    None
3     USD
Name: 0, dtype: object
于 2017-12-01T10:26:38.550 回答
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
于 2017-12-01T10:25:06.930 回答