Преобразование определяемой пользователем функции Python Pandas Dataframe не работает - PullRequest
0 голосов
/ 31 января 2020

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

import pandas as pd
data = {"index_id": range(101, 131),
    'company': ['Opera', 'Opera', 'Opera', 'Opera', 'Opera', 'Opera',
    'Firefox', 'Firefox', 'Firefox', 'Firefox', 'Firefox', 'Firefox',
    'Safari', 'Safari', 'Safari', 'Safari', 'Safari', 'Safari',
    'Brave', 'Brave', 'Brave', 'Brave', 'Brave', 'Brave',
    'Chrome', 'Chrome', 'Chrome', 'Chrome', 'Chrome', 'Chrome'],
    "rating": [4, 5, 3, 3, 3, 3,
    4, 5, 5, 1, 5, 5,
    1, 4, 1, 2, 1, 2,
    1, 5, 1, 5, 1, 5,
    5, 5, 5, 4, 5, 4]
    }
df = pd.DataFrame(data)

def AggRankBinRenameJoin (df_unaggdf):
    #aggregating the unaggregated df
    df_agg = df_unaggdf.groupby(['company']).agg({'rating':['std', 'mean']})
    df_agg.columns = ['rating_std', 'rating_mean']
    print(df_agg)
    df_rank = df_agg.rank(ascending = 0, method = 'dense').add_prefix('rank_')
    print(df_rank)
    bin_labels = ['Diamond', 'Platinum', 'Gold', 'Silver', 'Bronze']
    #bin_labels_reverse = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond']
    df_bin= df_rank.apply(lambda x:pd.qcut(x, q=[0, .2, .4, .6, .8, 1], labels=bin_labels))
    print(df_bin)
    output = df_agg.join(df_rank).join(df_bin.add_prefix('bin_'))
    print(output)
    df_unaggdf = output.copy(deep = True)
    return df_unaggdf

AggRankBinRenameJoin(df)

Ответы [ 2 ]

1 голос
/ 31 января 2020

вам нужно указать фрейм данных / и / или переменные, которые вы хотите вернуть.

Как в:

def AggRankBinRenameJoin (df_unaggdf):
    #aggregating the unaggregated df
    df_agg = df_unaggdf.groupby(['company']).agg({'rating':['std', 'mean']})
    df_agg.columns = ['rating_std', 'rating_mean']
    print(df_agg)
    df_rank = df_agg.rank(ascending = 0, method = 'dense').add_prefix('rank_')
    print(df_rank)
    bin_labels = ['Diamond', 'Platinum', 'Gold', 'Silver', 'Bronze']
    #bin_labels_reverse = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond']
    df_bin= df_rank.apply(lambda x:pd.qcut(x, q=[0, .2, .4, .6, .8, 1], labels=bin_labels))
    print(df_bin)
    output = df_agg.join(df_rank).join(df_bin.add_prefix('bin_'))
    print(output)
    df_unaggdf = output.copy(deep = True)
    return df_unaggdf

Если вы хотите преобразовать исходный df с помощью функции, укажите

df=AggRankBinRenameJoin(df)

Примечание. Я не сделал просмотрите это для любых других потенциальных ошибок. Если таковые имеются, было бы полезно, если бы вы отредактировали свой вопрос, чтобы отобразилось сообщение об ошибке.

0 голосов
/ 31 января 2020

Разобрался. Требуется установить функцию AggRankBinRenameJoin (которая возвращает фрейм данных) равной переменной, поэтому переменная будет равна возвращенному фрейму данных.

import pandas as pd
data = {"index_id": range(101, 131),
    'company': ['Opera', 'Opera', 'Opera', 'Opera', 'Opera', 'Opera',
    'Firefox', 'Firefox', 'Firefox', 'Firefox', 'Firefox', 'Firefox',
    'Safari', 'Safari', 'Safari', 'Safari', 'Safari', 'Safari',
    'Brave', 'Brave', 'Brave', 'Brave', 'Brave', 'Brave',
    'Chrome', 'Chrome', 'Chrome', 'Chrome', 'Chrome', 'Chrome'],
    "rating": [4, 5, 3, 3, 3, 3,
    4, 5, 5, 1, 5, 5,
    1, 4, 1, 2, 1, 2,
    1, 5, 1, 5, 1, 5,
    5, 5, 5, 4, 5, 4]
    }
df = pd.DataFrame(data)

def AggRankBinRenameJoin (df_unaggdf):
    #aggregating the unaggregated df
    df_agg = df_unaggdf.groupby(['company']).agg({'rating':['std', 'mean']})
    df_agg.columns = ['rating_std', 'rating_mean']
    print(df_agg)
    df_rank = df_agg.rank(ascending = 0, method = 'dense').add_prefix('rank_')
    print(df_rank)
    bin_labels = ['Diamond', 'Platinum', 'Gold', 'Silver', 'Bronze']
    #bin_labels_reverse = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond']
    df_bin= df_rank.apply(lambda x:pd.qcut(x, q=[0, .2, .4, .6, .8, 1], labels=bin_labels))
    print(df_bin)
    output = df_agg.join(df_rank).join(df_bin.add_prefix('bin_'))
    print(output)
    df_unaggdf = output.copy(deep = True)
    return df_unaggdf

df1 = AggRankBinRenameJoin(df)
...