返回将pandas数据帧作为参数的函数输出

时间:2014-07-31 22:06:53

标签: python pandas

我有一个pandas数据框,如下所示:

d = {'some_col' : ['A', 'B', 'C', 'D', 'E'],
     'alert_status' : [1, 2, 0, 0, 5]}
df = pd.DataFrame(d)

我的工作中有很多任务需要在熊猫中完成相同的任务。我开始编写标准化函数,将数据帧作为参数并返回一些东西。这是一个简单的问题:

def alert_read_text(df, alert_status=None):
    if (alert_status is None):
        print 'Warning: A column name with the alerts must be specified'
    alert_read_criteria = df[alert_status] >= 1
    df[alert_status].loc[alert_read_criteria] = 1
    alert_status_dict = {0 : 'Not Read',
                         1 : 'Read'}
    df[alert_status] = df[alert_status].map(alert_status_dict)
    return df[alert_status]

我希望函数返回一个系列。这样,可以在现有数据框中添加一列:

df['alert_status_text'] = alert_read_text(df, alert_status='alert_status')

但是,目前,此函数将正确返回一个系列,但也会修改现有列。你怎么做到这样传入的原始列没有被修改?

2 个答案:

答案 0 :(得分:4)

正如您所发现的,传入的数据框将被修改为params通过引用传递,这在python中是正确的,与pandas无关。

因此,如果您不想修改传递的df,请复制一份:

def alert_read_text(df, alert_status=None):
    if (alert_status is None):
        print 'Warning: A column name with the alerts must be specified'
    copy = df.copy()
    alert_read_criteria = copy[alert_status] >= 1
    copy[alert_status].loc[alert_read_criteria] = 1
    alert_status_dict = {0 : 'Not Read',
                         1 : 'Read'}
    copy[alert_status] = copy[alert_status].map(alert_status_dict)
    return copy[alert_status]

另见相关:pandas dataframe, copy by value

答案 1 :(得分:0)

您无需在示例中的 DataFrame 上设置任何值。

def alert_read_text(df, alert_status):
    alert_read_criteria = df[alert_status] >= 1
    alert_status_dict = {False : 'Not Read',
                     True : 'Read'}
    return alert_read_criteria.map(alert_status_dict)

由于 alert_read_criteria 系列与 df 具有相同的索引,因此您仍然可以在之后执行 df['alert_status_text'] = alert_read_text(df, alert_status='alert_status')

根据我的经验,将列分配给作为参数传递的 DataFrame 而不打算返回此类 DataFrame 通常是一种糟糕的模式。您可能还隐藏了该函数的副作用。