Агрегирование, ранжирование, объединение, переименование, каждый столбец в кадре данных - PullRequest
1 голос
/ 30 января 2020

Как мы можем написать функцию, которая будет агрегировать, ранжировать, сортировать по бинам каждый столбец 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-l oop, потому что с моим исходным набором данных. У меня есть 30 столбцов, которые я буду ранжировать и сортировать, поэтому я не могу назвать каждый из них в функции. Вывод данных будет выглядеть так.

1 Ответ

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

Используйте DataFrame.apply с лямбда-функцией, затем DataFrame.add_prefix и DataFrame.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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...