簡體   English   中英

對數據框中的每一列進行聚合、排名、分箱、重命名

[英]Aggregating, Ranking, Binning, Renaming, Each Column in a Dataframe

我們如何編寫一個函數來聚合、排序、合並 df 的每一列,通過添加前綴、排序和合並列來重命名聚合,然后將新的 rank 和 bin 列加入到 df 中?

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)
df = df.groupby(['company']).agg({'rating':['std', 'mean']})
df.columns = ['rating_std', 'rating_mean']
df_rank = df.rank(ascending = 0, method = 'dense').add_prefix('rank_')
output = df_rank.copy(deep=True)
bin_labels = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond']
output['bin_rank_rating_std'] = pd.qcut(output['rank_rating_std'],
                              q=[0, .2, .4, .6, .8, 1],
                              labels=bin_labels)
output['bin_rank_rating_mean'] = pd.qcut(output['rank_rating_mean'],
                              q=[0, .2, .4, .6, .8, 1],
                              labels=bin_labels)

在 df_rank 中,我能夠對標准差和平均值進行排名,然后添加排名的前綴,但無法弄清楚如何在不寫下每一列的情況下對每個排名列進行合並和重命名。 我想編寫一個函數或使用 for 循環,因為使用我的原始數據集。 我有 30 列要進行排名和分箱,因此我無法在函數中命名每一列。 數據幀輸出將是它應有的樣子。

使用DataFrame.apply和 lambda 函數,然后DataFrame.add_prefixDataFrame.join到原始DataFrame

#simplify for not necessary set new columns names by list
df = df.groupby(['company'])['rating'].agg(['std', 'mean']).add_prefix('rating_')

df_rank = df.rank(ascending = 0, method = 'dense').add_prefix('rank_')

bin_labels = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond']
output = df_rank.apply(lambda x:pd.qcut(x, q=[0, .2, .4, .6, .8, 1], labels=bin_labels))
output = df_rank.join(output.add_prefix('bin_'))
print (output)
         rank_rating_std  rank_rating_mean bin_rank_rating_std  \
company                                                          
Brave                1.0               4.0              Bronze   
Chrome               5.0               1.0             Diamond   
Firefox              2.0               2.0              Silver   
Opera                4.0               3.0            Platinum   
Safari               3.0               5.0                Gold   

        bin_rank_rating_mean  
company                       
Brave               Platinum  
Chrome                Bronze  
Firefox               Silver  
Opera                   Gold  
Safari               Diamond  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM