我是 Pandas 和 Numpy 的新手。我有一个数据框,我想通过将函数应用于列的每一行来创建一个新列。让我们举一个简单的例子:
import pandas as pd
import numpy as np
df = pd.DataFrame(columns=["names"], data=["Brussels", 2, "New York"])
def to_lower(value):
try:
return value.lower()
except AttributeError:
return None
def to_string(value):
return str(value)
df['lower_names'] = np.vectorize(to_lower)(df['names'])
这个操作效果非常好。现在我想仅对结果为 None 的“lower_names”行应用 to_string()
然后应用 to_lower()
(我不知道这是否是非常清楚)。
这看起来很基本,但我遇到了麻烦。我可以详细说明我的尝试,但我害怕显得白痴......也许我应该在使用这两个模块之前花一两周时间学习它们,但与此同时,任何建议都会受到欢迎。
编辑:对于我的简化示例,@jezrael 解决方案是正确的。现在,我们假设我想应用 np.vectorize(to_string)
函数,然后仅在“names”列的行上应用 np.vectorize(to_lower)
第一个结果是 None,最好的方法是什么?
最佳答案
我认为您需要将 return None
更改为 return to_string(value)
:
def to_lower(value):
try:
return value.lower()
except AttributeError:
return to_string(value)
def to_string(value):
return str(value)
df['lower_names'] = np.vectorize(to_lower)(df['names'])
print (df['lower_names'].apply(type))
0 <class 'str'>
1 <class 'str'>
2 <class 'str'>
Name: lower_names, dtype: object
也可以使用astype
将所有值转换为 str
然后 str.lower
:
df['lower_names'] = df['names'].astype(str).str.lower()
关于python - 如果第一个函数失败,则应用第二个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45167814/