有点坚持这个,所以希望有人可以提供帮助。通常我有一个像这样的数据框
df = pd.DataFrame({
"id": [1,1,1,4,5,5,7],
"value": [100, 100, 100, 45, 3, 3, 42]
})
我想要做的是每个重复的ID都会为每一行均匀地分配值,并创建一个新的变量来跟踪分割的数量。所以我的理想输出是这样的
id value value2 people
1 100 33.333333 0.333333
1 100 33.333333 0.333333
1 100 33.333333 0.333333
4 45 45.000000 1
5 3 1.500000 0.500000
5 3 1.500000 0.500000
7 42 42.000000 1
我通过这样做获得了价值2:
df['value2'] = df.groupby(['id'])['value'].apply(lambda x: x / len(x))
但没有幸运的人民专栏:(我最初尝试过:
df['people'] = df.groupby(['id']).apply(lambda x: 1. / len(x))
虽然很接近,但遗漏了一些东西
答案 0 :(得分:1)
最简单的方法是具体指定groupby的一个列(并不重要),并使用transform
代替apply
,就像这样。
df['people'] = df.groupby(['id'])['value'].transform(lambda x: 1. / len(x))
你第一次做的时候没有工作的原因是你的函数返回一个值,而不是一个值数组,所以transform
广播回到原始框架的形状,虽然apply
更灵活,但通常会传回函数返回的任何形状。