gpt4 book ai didi

python - groupby 应用所有其他键的操作

转载 作者:行者123 更新时间:2023-11-30 22:22:55 25 4
gpt4 key购买 nike

给定一个 pandas 数据框 df 我可以做 df.groupby('Age').apply(lambda x: x['ReadingAbility'].mean())从而得到每个年龄段的平均阅读能力。

现在假设我想要除 age=k 之外的所有年龄段的平均阅读能力

我能做到:

mu_other_ages = {}
for age in df['Age'].unique():
mu_other_ages[age] = df[df['Age'] != age]['ReadingAbility'].mean()

这在某种程度上与 groupby + apply 相反。
有什么捷径可以更有效地达到相同的结果吗?

请参阅以下示例:

In [52]: d = pd.DataFrame([[1,10], [2,4],[1, 9], [2,3]], columns=['Age', 'ReadingAbility'])                                                                                                                        

In [53]:

In [53]: d
Out[53]:
Age ReadingAbility
0 1 10
1 2 4
2 1 9
3 2 3

In [54]: d.groupby('Age').apply(lambda x: x['ReadingAbility'].mean())
Out[54]:
Age
1 9.5
2 3.5
dtype: float64

在只有 2 个不同年龄值的情况下,结果应反转为:2=9.51=3.5,而对于更多类别,值应为: Age=k 应该是:df[df['Age'] != k]['ReadingAbility'].mean()

只是为了澄清此示例的预期结果:2=9.5 和 1=3.5

最佳答案

您需要:

a = (d.groupby('Age')
.apply(lambda x: d.loc[d['Age']!=x['Age'].iat[0], 'ReadingAbility'].mean()))

print (a)
Age
1 3.5
2 9.5
dtype: float64

另一个非常快速的解决方案是聚合每个组的sumsize,然后减去sub两列的总和。最后除法:

np.random.seed(45)
d = pd.DataFrame(np.random.randint(10, size=(10, 2)), columns=['Age', 'ReadingAbility'])
print (d)
Age ReadingAbility
0 3 0
1 5 3
2 4 9
3 8 1
4 5 9
5 6 8
6 7 8
7 5 2
8 8 1
9 6 4
<小时/>
a = (d.groupby('Age')
.apply(lambda x: d.loc[d['Age']!=x['Age'].iat[0], 'ReadingAbility'].mean()))

print (a)
Age
3 5.000000
4 4.000000
5 4.428571
6 4.125000
7 4.111111
8 5.375000
<小时/>
c = d.groupby('Age')['ReadingAbility'].agg(['size','sum'])
print (c)
size sum
Age
3 1 0
4 1 9
5 3 14
6 2 12
7 1 8
8 2 2

e = c.rsub(c.sum())
e = e['sum'] / e['size']
print (e)
Age
3 5.000000
4 4.000000
5 4.428571
6 4.125000
7 4.111111
8 5.375000
dtype: float64

时间:

np.random.seed(45)
N = 100000
d = pd.DataFrame(np.random.randint(1000, size=(N, 2)), columns=['Age', 'ReadingAbility'])
#print (d)


In [30]: %timeit (d.groupby('Age').apply(lambda x: d.loc[d['Age']!=x['Age'].iat[0], 'ReadingAbility'].mean()))
1 loop, best of 3: 1.27 s per loop


In [31]: %%timeit
...: c = d.groupby('Age')['ReadingAbility'].agg(['size','sum'])
...: #print (c)
...: e = c.sub(c.sum())
...: e = e['sum'] / e['size']
...:
100 loops, best of 3: 6.28 ms per loop

关于python - groupby 应用所有其他键的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48188716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com