如果第一个函数失败,请应用第二个函数

时间:2017-07-18 13:11:41

标签: 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'])

此操作非常有效。现在我想将to_string()然后to_lower()仅应用于" lower_names"结果是无(我不知道这是否非常清楚)。

这看起来很基本,但我遇到了麻烦。我可以详细说明我的尝试,但我害怕出现一个白痴...也许我应该花一两个星期学习这两个模块然后再玩它们,但与此同时,任何建议都会受到欢迎。

编辑:@jezrael解决方案是正确的......对于我的简化示例。现在让我们想象一下,我想要将np.vectorize(to_string)函数应用于np.vectorize(to_lower),然后StanzaFilter subscribefilter = PresenceTypeFilter.SUBSCRIBE; PresenceSubscribeListener subscribeListener = new PresenceSubscribeListener(context.getApplicationContext(), connection); connection.addSyncStanzaListener(subscribeListener, subscribefilter); 仅应用于列的行和#34;名称"第一个结果是None,最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

我认为您需要将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()