定义函数的行为,具体取决于传入的名称

时间:2019-02-05 12:41:08

标签: python pandas dataframe

我已经创建了一个函数,但是我希望函数传递不同的名称,具体取决于传递给函数的名称

Created函数接收一个数据框,创建一个数据透视表并按100或0.01缩放某些列。对于特定类型的数据框(包含特定列),我不希望缩放平均权重。有没有办法找到通过的df的名称?

编辑:

所有df都具有相同的列名,因此仅通过传递给函数的名称来区分“ SpecialDF”与其他名称。在这一点上,我应该看课还是装饰? def scale(df)函数相当长,只有这一部分需要特殊处理

def scale(df):

    dfpvt= pd.pivot_table(df, values=['Avg Wt', 'Avg Spd'], index=y,aggfunc='sum')

    dfpvt.loc[:['Avg Wt', 'Avg Spd']=dfpvt[['Avg Wt', 'Avg Spd']].apply(lambda x: x/100)

    return dfpvt   

我要找的是

def scale(df):

    dfpvt= pd.pivot_table(df, values=['Avg Wt', 'Avg Spd'], index=y,aggfunc='sum')

    if df==SpecialDF:
        dfpvt.loc[:['Avg Spd']=dfpvt[['Avg Spd']].apply(lambda x: x/100)
    else:
        dfpvt.loc[:['Avg Wt', 'Avg Spd']=dfpvt[['Avg Wt', 'Avg Spd']].apply(lambda x: x/100)
    return dfpvt   

2 个答案:

答案 0 :(得分:2)

  

对于特定类型的数据框(包含特定的   列),我不希望缩放平均权重。

使用if或三元语句来确定数据框中是否存在一列:

def scale(df):
    dfpvt = pd.pivot_table(df, values=['Avg Wt', 'Avg Spd'], index=y, aggfunc='sum')
    scale_cols = ['Avg Spd'] if 'some_col_label' in df else ['Avg Wt', 'Avg Spd']
    dfpvt.loc[: scale_cols] /= 100
    return dfpvt

想法是减少重复的代码,仅修改更改所需列所需的最基本对象,在这种情况下为list对象。

对于更通用的函数,您可以将scale_cols作为参数,并通过函数将pipe用作数据框:

def scale(df, scale_cols):
    dfpvt = pd.pivot_table(df, values=['Avg Wt', 'Avg Spd'], index=y, aggfunc='sum')
    dfpvt.loc[: scale_cols] /= 100
    return dfpvt

df = df.pipe(scale, ['Avg Spd'] if 'some_col_label' in df else ['Avg Wt', 'Avg Spd'])

  

所有df都具有相同的列名,因此要区分“ SpecialDF”   只能通过名称传递给函数。

您的更新要求完全不同于 。名称只是参考:不要依赖它们来处理条件。优良作法是使用字典存储您的数据框,并在字典中使用键来标识“特殊”数据框:

dfs = {'df1': df1, 'df2': df2}

def scale(df, scale_cols):
    dfpvt = pd.pivot_table(df, values=['Avg Wt', 'Avg Spd'], index=y, aggfunc='sum')
    dfpvt.loc[: scale_cols] /= 100
    return dfpvt

key = 'df1'
dfs[key] = dfs[key].pipe(scale, ['Avg Spd'] if key == 'df1' else ['Avg Wt', 'Avg Spd'])

答案 1 :(得分:0)

基于DataFrame的“类型”一词,您需要isinstancedocumentation here)。

但是,由于您说“其中包含特定的列”,因此您实际上可能是指if col in df,其中col是该特定列的名称。