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_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
您可以使用 isnumeric
和 where
作为替代功能,即
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
我正在尝试应用一个函数来检查存储在系列中的字符串是否为数字,如果是,则将它们转换为 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_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
您可以使用 isnumeric
和 where
作为替代功能,即
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