2016-11-18 119 views
0

我有以下數據框,我需要使用聚合函數爲我列在值中的一個特定列。我正在使用來自熊貓的數據透視表。在數據框上使用聚合

Sample ID Type Score Freq 
AE01 AAA Non 0.65 1 
AE01 BBB IND 0.57 14 
AE03 SAS IND 0.56 14 
AE03 SAP IND 0.689 15 
AE03 TCS IND 0.56 16 
AE05 BBB IND 0.85 17 
AE05 CTC IND 0.45 18 
AE05 CTC Non 0.15 19 
AE05 CTC Non 0.14 20 
AE05 CTC Non 0.4678 21 

下面是我用腳本,

table_pat_rel = pd.pivot_table(df,index=["ID",'Type'],values=['Sample'], 
       aggfunc={'Sample':np.size}) 

給一些下面的輸出,

​​

但我的目標如下輸出,

ID Recurrence Sample 
AAA 1 AE01 
BBB 2 AE01 
     AE05 
SAS 1 AE03 
SAP 1 AE03 
TCS 1 AE03 
CTC 4 AE05 

我試着用groupby作爲fol降脂

df.drop_duplicates(['Sample', 'ID']).groupby(['ID','Sample']).size().sort_values(ascending=True).head() 

回答

1

數據:

df = pd.DataFrame(
{'Score': [0.65, 0.57, 0.56, 0.689, 0.56, 0.85, 0.45, 0.15, 0.14, 0.4678], 
'ID': ['AAA', 'BBB', 'SAS', 'SAP', 'TCS', 'BBB', 'CTC', 'CTC', 'CTC', 'CTC'], 
'Sample': ['AE01', 'AE01', 'AE03', 'AE03', 'AE03', 'AE05', 'AE05', 'AE05', 'AE05', 'AE05'], 
'Freq': [1, 14, 14, 15, 16, 17, 18, 19, 20, 21], 
'Type': ['Non', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND']}, 
columns=['Sample','ID','Type','Score','Freq']) 
print (df) 
    Sample ID Type Score Freq 
0 AE01 AAA Non 0.6500  1 
1 AE01 BBB IND 0.5700 14 
2 AE03 SAS IND 0.5600 14 
3 AE03 SAP IND 0.6890 15 
4 AE03 TCS IND 0.5600 16 
5 AE05 BBB IND 0.8500 17 
6 AE05 CTC IND 0.4500 18 
7 AE05 CTC IND 0.1500 19 
8 AE05 CTC IND 0.1400 20 
9 AE05 CTC IND 0.4678 21 

orig = pd.pivot_table(df,index=["ID",'Type'],values=['Sample'], 
       aggfunc={'Sample':np.size}) 

print (orig) 
      Sample 
ID Type   
AAA Non  1 
BBB IND  2 
CTC IND  4 
SAP IND  1 
SAS IND  1 
TCS IND  1 

我想你需要換SampleType,而是values=['Sample']使用values=['Freq'],但似乎你可以使用不用於index一些列,因爲使用aggfunc=len(同作爲aggfunc='size'

table_pat_rel1 = pd.pivot_table(df,index=["ID",'Sample'],values=['Freq'],aggfunc=len) \ 
        .reset_index(level=1) \ 
        .rename(columns={'Freq':'Recurrence'}) \ 
        .set_index('Recurrence', append=True) 
print (table_pat_rel1) 
       Sample 
ID Recurrence  
AAA 1   AE01 
BBB 1   AE01 
    1   AE05 
CTC 4   AE05 
SAP 1   AE03 
SAS 1   AE03 
TCS 1   AE03 

或使用groupby與聚集size

table_pat_rel2 = df.groupby(['ID','Sample']) \ 
        .size() \ 
        .reset_index(level=1) \ 
        .rename(columns={0:'Recurrence'}) \ 
        .set_index('Recurrence', append=True) 

print (table_pat_rel2) 
       Sample 
ID Recurrence  
AAA 1   AE01 
BBB 1   AE01 
    1   AE05 
CTC 4   AE05 
SAP 1   AE03 
SAS 1   AE03 
TCS 1   AE03 
+0

您好感謝您的解決方案,但我已經編輯了我的輸出,你可以請現在 – user1017373

+0

謝謝。爲什麼是BBB兩次?是錯字嗎? – jezrael

+0

似乎有一行BBB丟失。 – jezrael