Определите, как ведет себя функция, в зависимости от того, какое имя передается в - PullRequest
0 голосов
/ 05 февраля 2019

Я создал функцию, но в зависимости от того, какое имя передается в функцию, я бы хотел, чтобы функция велась по-разному

Созданная функция принимает кадр данных, создает сводную таблицу и масштабирует некоторые столбцы с помощью100 или 0,01.Для конкретного типа информационного кадра (который содержит определенный столбец) я не хочу масштабировать средний вес.Есть ли способ найти имя пройденного df?

edit:

все 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   

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Для определенного типа фрейма данных (который содержит определенный столбец) я не хочу масштабировать средний вес.

Используйте 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'])
0 голосов
/ 05 февраля 2019

Исходя из термина "тип" DataFrame, вам нужно isinstance ( документация здесь ).

Однако, поскольку вы говорите "который содержит определенный столбец", вывероятно, на самом деле означает if col in df, где col - это имя этого конкретного столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...