定义如何函数的行为,依赖于什么名字的传递

问题描述 投票:1回答:2

我创建了一个功能,但根据什么名字被传递到函数,我想表现不同的功能

创建的函数接受一个数据帧,创建一个数据透视表和由100或0.01缩放某些列。对于特定类型的数据框的(其中包含一个特定的列),我不想平均重量进行缩放。有没有办法找到通过DF的名字吗?

编辑:

所有DF具有相同的列名,所以要区分“SpecialDF”别人只有通过它的名字传递给函数。在这一点上,我应该看着类或装饰?在DEF规模(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   
python pandas dataframe
2个回答
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”别人只有通过它的名字传递给函数。

你更新的要求是完全不同的。名都只是引用:不依赖于他们的加工条件。好的做法是使用字典您dataframes和使用的密钥保存在你的字典,以确定一个“特殊”的数据帧:

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

0
投票

根据数据帧的术语“类型”,你想isinstancedocumentation here)。

但是,既然你说“其中包含特定列”,你可能实际上意味着if col in df,其中col是特定列的名称。

© www.soinside.com 2019 - 2024. All rights reserved.