Pandas Series.apply()没有按预期工作

时间:2017-12-01 10:17:54

标签: python pandas vectorization pandas-apply

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

3 个答案:

答案 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