我有一个df:

temp = pd.DataFrame({'Y': ['A', 'B', 'B', 'A', 'B'],
                    'Z': [10, 5, 6, np.nan, 12],
                                        })


我将Y设置为索引,然后按组计算计数和大小:

temp.sort('Y', inplace=True)
temp.set_index('Y', inplace=True, drop=False)
temp.sort_index( inplace=True)

temp['n_obs'] = temp.groupby(by='Y')['Z'].transform('size')
temp['valid'] = temp.groupby(by='Y')['Z'].transform('count')


这产生:

   Y     Z  n_obs  valid
Y
A  A  10.0    2.0    1.0
A  A   NaN    2.0    1.0
B  B   5.0    3.0    3.0
B  B   6.0    3.0    3.0
B  B  12.0    3.0    3.0


现在,我想将有效除以n-obs分组:

temp['New']=temp.groupby(by='Y').apply(lambda x: (x['valid'] / x['n_obs']))


但是我得到这个错误:

Exception: cannot handle a non-unique multi-index!


请解决吗?

最佳答案

我认为您可以使用两次reset_index

temp.sort_values('Y', inplace=True)
temp.set_index('Y', inplace=True, drop=False)
temp.sort_index( inplace=True)

temp['n_obs'] = temp.groupby(by='Y')['Z'].transform('size')
temp['valid'] = temp.groupby(by='Y')['Z'].transform('count')

temp.reset_index(drop=True, inplace=True)

temp['New'] = temp.groupby(by='Y')
                  .apply(lambda x: (x['valid'] / x['n_obs']))
                  .reset_index(drop=True, level=0)
print (temp)
   Y     Z  n_obs  valid  New
0  A  10.0    2.0    1.0  0.5
1  A   NaN    2.0    1.0  0.5
2  B   5.0    3.0    3.0  1.0
3  B   6.0    3.0    3.0  1.0
4  B  12.0    3.0    3.0  1.0


但是,如果省略groupby并仅划分列,结果似乎是相同的:

temp.sort_values('Y', inplace=True)
temp.set_index('Y', inplace=True, drop=False)
temp.sort_index( inplace=True)

temp['n_obs'] = temp.groupby(by='Y')['Z'].transform('size')
temp['valid'] = temp.groupby(by='Y')['Z'].transform('count')


temp['New'] = temp['valid'] / temp['n_obs']
print (temp)
   Y     Z  n_obs  valid  New
Y
A  A  10.0    2.0    1.0  0.5
A  A   NaN    2.0    1.0  0.5
B  B   5.0    3.0    3.0  1.0
B  B   6.0    3.0    3.0  1.0
B  B  12.0    3.0    3.0  1.0

08-24 19:51