python - 如果第一个函数失败,则应用第二个函数

标签 python pandas numpy

我是 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/

相关文章:

python - 当我在 python 和 pyqt 中关闭应用程序时不运行类析构函数

python - python的字符串方法中%的转义字符是什么

python - 如何在二元分类器中按预测概率进行排序?

Python读取pickle协议(protocol)4错误: STACK_GLOBAL requires str

python - pandas 数据框的处理

python - 无效类型 ‘float[int]’ 数组下标错误并将变量传递给 scipy.weave.inline

python - numpy.exp() 到底是做什么的?

python - 如何比较模型字段和选择中的 unicode 字符串? Django

python udp客户端超时机制

python - 创建具有重复模式的 numpy 数组