我创建了一个功能,但根据什么名字被传递到函数,我想表现不同的功能
创建的函数接受一个数据帧,创建一个数据透视表和由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
对于特定类型的数据框的(其中包含一个特定的列),我不想平均重量进行缩放。
使用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'])
根据数据帧的术语“类型”,你想isinstance
(documentation here)。
但是,既然你说“其中包含特定列”,你可能实际上意味着if col in df
,其中col
是特定列的名称。