首页 > 解决方案 > 使用管道创建和附加 pandas 虚拟变量

问题描述

我正在尝试创建一个创建虚拟变量并将列附加到现有数据框的 Pandas 管道。不幸的是,当管道完成时,我无法让附加的列粘住。

例子:


def function(df):
    pass

def create_dummy(df):
    a = pd.get_dummy(df['col'])
    b = df.append(a)
    return b

def mah_pipe(df):
    (df.pipe(function)
     .pipe(create_dummy)
     .pipe(print)
    return df

print(mah_pipe(df))

首先 - 我不知道这是否是好的做法。奇怪的是.pipe(print)打印带有附加列的数据框。耶。

但声明print(mah_pipe(df))没有。我虽然他们会以同样的方式行事。我试图阅读有关的文档,pd.pipe但我无法弄清楚。

希望有人可以帮助阐明正在发生的事情。

标签: pythonpandasdataframe

解决方案


这是因为print在 Python 中返回None. 由于您没有df在管道上制作副本,因此您dfprint.

Pandas 中的管道

除非用作最后一个管道,否则在 Pandas 中,我们除了(df) -> [pipe] -> (df_1)-> [pipe2] ->(df_2)-> [pipeN] -> df_N将 print 作为最后一个管道,输出为None.

解决方案

...
def start_pipe(dataf):
    # allows make a copy to avoid modifying original 
    dataf = dataf.copy()

def create_dummies(dataf, column_name):
    dummies = pd.get_dummies(dataf[column_name])
    dataf[dummies.columns] = dummies

    return dataf

def print_dataf(dataf, n_rows=5):
    print(dataf.head(n_rows))

    return dataf # this is important 

# usage

...
dt = (df
           .pipe(start_pipe)
           .pipe(create_dummies, column_name='a')
           .pipe(print_dataf, n_rows=10)
)


def mah_pipe(df):
     df = (df
           .pipe(start_pipe)
           .pipe(create_dummies, column_name='a')
           .pipe(print_dataf, n_rows=10)
    )
    return df

print(mah_pipe(df))

推荐阅读