我已经创建了一个函数,但是根据函数中传递的名称,我希望函数的行为有所不同
创建的函数接受一个数据框,创建一个数据透视表,并按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
最佳答案
对于特定类型的数据框(其中包含特定
列),我不希望缩放平均权重。
使用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'])
关于python - 定义函数的行为,具体取决于传入的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54534678/