2016-11-25 100 views
1

我有一個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! 

解決方案嗎?

回答

1

我認爲你可以使用兩次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