基于单列大小的新列

时间:2015-04-21 03:54:31

标签: python numpy pandas

我正在尝试为当前数据框创建一个新列'score / id.size'

np.random.seed(1234)
test = pd.DataFrame({'id':np.random.randint(1,5,10),
                     'score':np.random.uniform(0,1,10)})

test = test.sort(['id'])

test
   id     score
4   1  0.875933
5   1  0.357817
6   1  0.500995
3   2  0.958139
7   2  0.683463
9   2  0.370251
2   3  0.801872
0   4  0.272593
1   4  0.276464
8   4  0.712702

我希望我的新数据框是这样的:

   id     score       score/id.size
4   1  0.875933       0.875933 / 3
5   1  0.357817       0.357817 / 3
6   1  0.500995       0.500995 / 3
3   2  0.958139       0.958139 / 3
7   2  0.683463       0.683463 / 3
9   2  0.370251       0.370251 / 3
2   3  0.801872       0.801872 / 1
0   4  0.272593       0.272593 / 3
1   4  0.276464       0.276464 / 3
8   4  0.712702       0.712702 / 3

很抱歉,如果这个问题太基础,我不熟悉Python。

谢谢!

4 个答案:

答案 0 :(得分:1)

正如我所看到的,您需要按id进行分组并计数,然后将其用作在新列中执行操作的键。

counts = test.groupby("id").count()
test["score/id.size"] = test.apply(lambda x: x["score"] / float(counts[counts.index==x["id"]].score), axis=1)

test
   id     score  score/id.size
4   1  0.875933       0.291978
5   1  0.357817       0.119272
6   1  0.500995       0.166998
3   2  0.958139       0.319380
7   2  0.683463       0.227821
9   2  0.370251       0.123417
2   3  0.801872       0.801872
0   4  0.272593       0.090864
1   4  0.276464       0.092155
8   4  0.712702       0.237567

答案 1 :(得分:1)

这将完成这项工作:

test['score / id.size'] = test.score / [(test.id == i).sum() for i in test.id]

答案 2 :(得分:1)

我认为这个答案更好地利用了熊猫的自动分组和对齐功能,而不是已经发布的那些,只是按照组的大小进行分组:

test['score_normalized'] = test.groupby('id', group_keys=False).apply(
    lambda g: g['score'] / len(g)
)

test
Out[9]: 
   id     score  score_normalized
4   1  0.875933          0.291978
5   1  0.357817          0.119272
6   1  0.500995          0.166998
3   2  0.958139          0.319380
7   2  0.683463          0.227821
9   2  0.370251          0.123417
2   3  0.801872          0.801872
0   4  0.272593          0.090864
1   4  0.276464          0.092155
8   4  0.712702          0.237567

答案 3 :(得分:1)

如果您想要从groupby添加计算列,则应使用transform

In [116]:

np.random.seed(1234)
test = pd.DataFrame({'id':np.random.randint(1,5,10),
                     'score':np.random.uniform(0,1,10)})
​
test = test.sort(['id'])
test
Out[116]:
   id     score
4   1  0.875933
5   1  0.357817
6   1  0.500995
3   2  0.958139
7   2  0.683463
9   2  0.370251
2   3  0.801872
0   4  0.272593
1   4  0.276464
8   4  0.712702
In [117]:

test['score/id.size'] = test.groupby('id')['score'].transform(lambda x: x / x.count())
test
Out[117]:
   id     score  score/id.size
4   1  0.875933       0.291978
5   1  0.357817       0.119272
6   1  0.500995       0.166998
3   2  0.958139       0.319380
7   2  0.683463       0.227821
9   2  0.370251       0.123417
2   3  0.801872       0.801872
0   4  0.272593       0.090864
1   4  0.276464       0.092155
8   4  0.712702       0.237567

transform返回与原始df

对齐的系列