pandas 转换组中的位置/排名 [英] Pandas Transform Position/Rank in Group
本文介绍了 pandas 转换组中的位置/排名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下是我的DataFrame
,其中有两组动物以及它们每天吃多少食物,
I have the following DataFrame
with two groups of animals and how much food they eat each day,
df = pd.DataFrame({'animals': ['cat', 'cat', 'dog', 'dog', 'rat',
'cat', 'rat', 'rat', 'dog', 'cat'],
'food': [1, 2, 2, 5, 3, 1, 4, 0, 6, 5]},
index=pd.MultiIndex.from_product([['group1'] + ['group2'],
list(range(5))])
).rename_axis(['groups', 'day'])
df
animals food
groups day
group1 0 cat 1
1 cat 2
2 dog 2
3 dog 5
4 rat 3
group2 0 cat 1
1 rat 4
2 rat 0
3 dog 6
4 cat 5
我可以将其映射"/转换为新的列,以查看每只动物每天应喂多少食物.
I can "map"/transform this into a new column to see how much food each individual animal should be given per day daily_meal
.
df['daily_meal'] = df.groupby(['animals', 'groups']).transform('mean')
df
animals food daily_meal
groups day
group1 0 cat 1 1.5
1 cat 2 1.5
2 dog 2 3.5
3 dog 5 3.5
4 rat 3 3.0
group2 0 cat 1 3.0
1 rat 4 2.0
2 rat 0 2.0
3 dog 6 6.0
4 cat 5 3.0
我现在想知道daily_meal在每个组中的位置,然后将其映射"/转换为名为group_rank
的新列.我该怎么办?
I now wish to know where that daily_meal ranks within each group, and "map"/transform this into a new column called group_rank
. How can I do this?
例如
animals food daily_meal group_rank
groups day
group1 0 cat 1 1.5 1
1 cat 2 1.5 1
2 dog 2 3.5 3
3 dog 5 3.5 3
4 rat 3 3.0 2
group2 0 cat 1 3.0 2
1 rat 4 2.0 1
2 rat 0 2.0 1
3 dog 6 6.0 3
4 cat 5 3.0 2
推荐答案
使用双或者:
s = df.groupby(['animals', 'groups'])['food'].transform('mean')
df['group_rank'] = s.groupby('groups').transform(lambda x: x.rank(method='dense'))
print (df)
animals food group_rank
groups day
group1 0 cat 1 1.0
1 cat 2 1.0
2 dog 2 3.0
3 dog 5 3.0
4 rat 3 2.0
group2 0 cat 1 2.0
1 rat 4 1.0
2 rat 0 1.0
3 dog 6 3.0
4 cat 5 2.0
感谢斯科特·波士顿,以改善解决方案:>
Thanks Scott Boston for improving solution:
df['daily_meal'] = df.groupby(['animals', 'groups'])['food'].transform('mean')
df['group_rank'] = df.groupby('groups')['daily_meal'].rank(method='dense')
s = df.groupby(['animals', 'groups'])['food'].transform('mean')
df['group_rank'] = s.groupby('groups').rank(method='dense')
这篇关于 pandas 转换组中的位置/排名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文