Python 根据传入的名称定义函数的行为

Python 根据传入的名称定义函数的行为,python,pandas,dataframe,Python,Pandas,Dataframe,我创建了一个函数,但根据传入函数的名称,我希望函数的行为有所不同 Created函数接收一个数据帧,创建一个数据透视表,并将某些列按100或0.01的比例缩放。对于特定类型的数据帧(包含特定列),我不希望缩放平均权重。有没有办法找到传递的df的名称 编辑: 所有的df都有相同的列名,所以要将“SpecialDF”与其他df区分开来,只需将其名称传递到函数中即可。在这一点上,我应该关注类还是装饰器?def scale(df)功能相当长,仅此部分需要特殊处理 def scale(df):

我创建了一个函数,但根据传入函数的名称,我希望函数的行为有所不同

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

编辑:

所有的df都有相同的列名,所以要将“SpecialDF”与其他df区分开来,只需将其名称传递到函数中即可。在这一点上,我应该关注类还是装饰器?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   
根据数据帧的术语“类型”,您需要
isinstance
()

然而,由于您说“其中包含一个特定列”,您可能实际上是指
如果df中的col
,其中
col
是该特定列的名称

对于特定类型的数据帧(其中包含特定的 列),我不希望缩放平均重量

使用
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
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'])
其思想是减少重复代码,只修改更改所需列所需的最基本对象,在本例中是
列表
对象

对于更通用的函数,可以使用
scale\u cols
作为参数,并通过函数使用数据帧:

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” 从其他函数中只能通过其名称传递到函数中

您的更新要求完全不同。名称只是引用:不要依赖它们作为处理条件。良好做法是使用字典存储数据帧,并使用字典中的键识别“特殊”数据帧:

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
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'])

拥有一个特定的列并不会使DF成为不同的类型,它仍然是相同的DF,如果您想检查一个特定的列,将其名称作为输入传递给函数,并检查它是否存在于DF列名称中,如果是,则应用您的操作或普通操作来添加,所有DF都具有相同的列名,以便区分“SpecialDF”从其他函数中只能通过其名称传递到函数中。在这一点上,我应该关注类还是装饰器?def scale(df)功能相当长,仅此部分需要特殊处理