我正在尝试为当前数据框创建一个新列'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。
谢谢!
答案 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