Python pandas在所有重复的ID中均匀地分割行的值

时间:2014-10-01 16:28:09

标签: python pandas

有点坚持这个,所以希望有人可以提供帮助。通常我有一个像这样的数据框

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))

虽然很接近,但遗漏了一些东西

1 个答案:

答案 0 :(得分:1)

最简单的方法是具体指定groupby的一个列(并不重要),并使用transform代替apply,就像这样。

df['people'] = df.groupby(['id'])['value'].transform(lambda x: 1. / len(x))

你第一次做的时候没有工作的原因是你的函数返回一个值,而不是一个值数组,所以transform广播回到原始框架的形状,虽然apply更灵活,但通常会传回函数返回的任何形状。