Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas sum over duplicated indices with sum

I have a data frame indexed by date

transactions_ind
Out[25]: 
                   Ticker     Transaction  Number_of_units      Price
Date                                                                 
2012-10-11  ROG VX Equity             Buy            12000  182.00000
2012-10-16  ROG VX Equity            Sell            -5000  184.70000
2012-11-16  ROG VX Equity            Sell            -5000  175.51580
2012-12-07  ROG VX Equity             Buy             5000  184.90000
2012-12-11  ROG VX Equity            Sell            -3000  188.50000
2012-12-11  ROG VX Equity  Reversal: Sell             3000  188.50000
2012-12-11  ROG VX Equity            Sell            -3000  188.50000
2012-12-11  ROG VX Equity  Reversal: Sell             3000  188.50000
2012-12-11  ROG VX Equity            Sell            -3000  188.50000
2012-12-20  ROG VX Equity            Sell            -5000  185.80000

I want to sum over the duplicated index values (2012-12-11) but only over the column "Number_of_units".

transactions_ind
Out[25]: 
                   Ticker     Transaction  Number_of_units      Price
Date                                                                 
2012-10-11  ROG VX Equity             Buy            12000  182.00000
2012-10-16  ROG VX Equity            Sell            -5000  184.70000
2012-11-16  ROG VX Equity            Sell            -5000  175.51580
2012-12-07  ROG VX Equity             Buy             5000  184.90000
2012-12-11  ROG VX Equity            Sell            -3000  188.50000
2012-12-20  ROG VX Equity            Sell            -5000  185.80000

Using

transactions_ind.groupby(transactions_ind.index).sum()

deletes the columns "Ticker" and "Transaction" since those are filled with non-numeric values. Also I would olike to know how to deal with the different strings in the "Transactions" column when I sum over the "Number_of_units" column. Hope there exists a one-liner in pandas. Thanks for your help!

like image 752
Pat Avatar asked Feb 15 '16 07:02

Pat


1 Answers

You can use agg with first and sum:

df = df.groupby(df.index).agg({'Ticker': 'first',
                                'Transaction': 'first',
                                'Number_of_units':sum, 
                                'Price': 'first'})
#reorder columns
df = df[['Ticker','Transaction','Number_of_units','Price']]
print df
                   Ticker Transaction  Number_of_units     Price
Date                                                            
2012-10-11  ROG VX Equity         Buy            12000  182.0000
2012-10-16  ROG VX Equity        Sell            -5000  184.7000
2012-11-16  ROG VX Equity        Sell            -5000  175.5158
2012-12-07  ROG VX Equity         Buy             5000  184.9000
2012-12-11  ROG VX Equity        Sell            -3000  188.5000
2012-12-20  ROG VX Equity        Sell            -5000  185.8000
like image 86
jezrael Avatar answered Oct 16 '22 17:10

jezrael