Для определенного типа фрейма данных (который содержит определенный столбец) я не хочу масштабировать средний вес.
Используйте 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'])