除了Sum

时间:2018-03-02 01:25:44

标签: python pandas

我希望除了Sum之外还要做几个数学函数。

首先,我需要按“问题”名称和“类型”进行分组。之后有计数,总和,平均值等......

目前我正在对同一数据进行第二次数据库调用(下图)。

使用pandas完成所有操作以及摆脱第二次数据库调用的最佳方法是什么?

感谢。

数据框:

 action  code comm   credit date        debit  \
0  +     P  1309.28   0.00  2009-06-25  52371.00   
1  +     P  2397.49   0.00  2009-07-31  47949.81   
2  +     P   749.78   0.00  2011-05-27  14995.65   

    issue                                              price  \
0   PR SALES TAX FING CORP RETAIL SR B RV DUE 0801...  0.1746   
1   TAX FREE PUERTO RICO FUND II INC                   8.5600   
2   PUERTO RICO FIXED INCOME FD III INC                8.6400   

   shares      type  
0  300000.000  finc  
1    5601.000  mfds  
2    1735.000  mfds  

数据库等价物:

cons = c.trades_set.all () \
    .values ( 'issue', 'type' ) \
    .annotate (
    cnt = Count ( 'issue' ),
    debit = Sum ( 'debit' ),
    credit = Sum ( 'credit' ),
    shrs = Sum ( 'shares' ) / 2,
    price = Avg ( 'price' ),
    ).order_by ( 'type', 'issue' )

1 个答案:

答案 0 :(得分:1)

这是一个解决方案。我发明了一些数据来证明这个原理。

import pandas as pd

df = pd.DataFrame({'issue': ['A', 'B', 'A', 'B', 'C', 'C'],
                   'type': ['X', 'X', 'X', 'Y', 'Y', 'Y'],
                   'col1': [1, 2, 3, 4, 5, 6],
                   'col2': [7, 8, 9, 10, 11, 12],
                   'col3': [13, 14, 15, 16, 17, 18],
                   'col4': [18, 19, 20, 21, 22, 23]})

g = df.groupby(['issue', 'type'], as_index=False).agg({'col1': 'count', 'col2': 'sum',
                                                       'col3': lambda x: sum(x)/2,
                                                       'col4': lambda x: sum(x)/len(x)})

#   issue type  col1  col2  col3  col4
# 0     A    X     2    16  14.0  19.0
# 1     B    X     1     8   7.0  19.0
# 2     B    Y     1    10   8.0  21.0
# 3     C    Y     2    23  17.5  22.5