用户定义的转换Python数据帧的函数不工作

2024-10-01 05:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

显然,我不明白用户定义函数中的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)

Tags: dflabelsbin语句operachromefirefoxagg
2条回答

您需要指定要返回的数据帧和/或变量

例如:

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)

注意,我没有检查这篇文章是否有任何其他潜在的错误。如果存在任何问题,请编辑问题以显示错误消息

我明白了。需要将函数agrankbinRenameJoin(返回数据帧)设置为等于一个变量,以便该变量等于返回的数据帧

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)

相关问题 更多 >