Pandas Series.apply() 未按预期工作

Pandas Series.apply() not working as expected

我正在尝试应用一个函数来检查存储在系列中的字符串是否为数字,如果是,则将它们转换为 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 列)的测试环境中玩这个,但如果我能让它工作,我希望将它应用到更大的数据框,所以效率建议也是欢迎。提前致谢。

您需要 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

您可以将 to_numericerrors='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

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

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