我希望除了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' )
答案 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