我有一个DF:
Col1 Col2 Label
0 0 5345
1 0 7574
2 0 3445
0 1 2126
1 1 4653
2 1 9566
所以我试图在Col1和Col2上进行分组,以获得基于Label列的索引值,如下所示:
df_gb = df.groupby(['Col1','Col2'])['Label'].agg(['sum', 'count'])
df_gb['sum_count'] = df_gb['sum'] / df_gb['count']
sum_count_total = df_gb['sum_count'].sum()
index = df_gb['sum_count'] / 10
Col2 Col1
0 0 2.996036
1 3.030063
2 3.038579
1 0 2.925314
1 2.951295
2 2.956083
2 0 2.875549
1 2.899254
2 2.905063
到目前为止,一切都如我所料。但现在我想指定这个'索引' groupby df to my original' df'基于这两个groupby列。如果它只有一列,它使用map()函数,但如果我想根据两列的顺序分配索引值,则不行。
df_index = df.copy()
df_index['index'] = df.groupby([]).apply(index)
TypeError: 'Series' objects are mutable, thus they cannot be hashed
尝试使用agg()和transform()但没有成功。任何想法如何进行?
提前致谢。 赫里斯托斯。
答案 0 :(得分:6)
我相信你需要join
:
a = df.join(index.rename('new'), on=['Col1','Col2'])
print (a)
Col1 Col2 Label new
0 0 0 5345 534.5
1 1 0 7574 757.4
2 2 0 3445 344.5
3 0 1 2126 212.6
4 1 1 4653 465.3
5 2 1 9566 956.6
df['new']=df.groupby(['Col1','Col2'])['Label'].transform(lambda x: x.sum() / x.count()) / 10
print (df)
Col1 Col2 Label new
0 0 0 5345 534.5
1 1 0 7574 757.4
2 2 0 3445 344.5
3 0 1 2126 212.6
4 1 1 4653 465.3
5 2 1 9566 956.6
如果NaN
列中没有Label
使用Zero建议的解决方案,谢谢:
df.groupby(['Col1','Col2'])['Label'].transform('mean') / 10
如果需要count
只计算非NaN
s值,请使用transform
解决方案。