我们如何编写一个函数来聚合、排名、入库df的每一列,通过添加前缀、排名和入库列来重命名聚合的列,然后将新的排名和入库列连接到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列要排序和入库,所以我不能在一个函数中给每一列都命名。数据帧输出将是它应该看起来的样子。
发布于 2020-01-30 14:26:30
使用带有lambda函数的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 https://stackoverflow.com/questions/59980132
复制相似问题