Pandas,创建应用groupby值的新列

时间:2017-11-22 13:40:55

标签: pandas group-by multiple-columns

我有一个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()但没有成功。任何想法如何进行?

提前致谢。 赫里斯托斯。

1 个答案:

答案 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

GroupBy.transform

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解决方案。