2016-04-29 24 views
1

我想創建一個彙總表如下:如何獲得非數值數據的summay在Python

A= 
ID Date  C1 C2 
X  12/01/15 A  House 
X  18/04/15 B  Rent 
X  21/08/15 A  Rent 
Y  01/08/15 C  Rent 
Y  21/12/15 C  House 

B= 
ID C1 C2  Data 
X  3  House 12/01/15 
Y  2  Rent 01/08/15 

C= 
ID C1 C2 Date 
X  3  Rent 21/08/15 
Y  2  House 21/12/15 

它所做的是,每個ID,它計算數據條目的數量(行),在B的第C2列下放入第一個入口,並在C放入最後一個入口。

我可以使用groupby功能並獲得計數,但不知道如何使列C2

B = pd.DataFrame(A.groupby('ID', sort = False).count().ix[:, 1:]).reset_index(level=1) 

回答

1

您還可以查看日期和列並排 - 側:

>>> (gb.first() 
    .join(gb.last(), lsuffix='_first', rsuffix='_last')) 
    .join(gb.C1.agg({'C1_count': 'count'})) 

    Date_first C1_first C2_first Date_last C1_last C2_last C1_count 
ID                 
X 12/01/15  A House 21/08/15  A Rent   3 
Y 01/08/15  C  Rent 21/12/15  C House   2 
+0

謝謝,這太棒了。但是,如何選擇在「C1」中計數項目,並給出「Data」和「C2」列的第一個和最後一個實例? – Ana

+0

@Ana請參閱上面的修改回覆。 – Alexander

1

爲了得到第一個,最後一個和計數各組:

grp = df.groupby('ID') 
pd.concat([grp.first(), grp.last(), grp.size()], axis=1) 

     Date C1  C2  Date C1  C2 0 
ID           
X 12/01/15 A House 21/08/15 A Rent 3 
Y 01/08/15 C Rent 21/12/15 C House 2 

,或者在單獨DataFrames

grp.first().join(grp.size().to_frame()) 

     Date C1  C2 0 
ID      
X 12/01/15 A House 3 
Y 01/08/15 C Rent 2 

grp.last().join(grp.size().to_frame()) 

     Date C1  C2 0 
ID      
X 21/08/15 A Rent 3 
Y 21/12/15 C House 2 
+0

謝謝@Stef一個,這個答案也是正確和乾淨的。 – Ana