python - 根据自定义函数汇总数据框中的多个列

原文 标签 python pandas dataframe group-by summary

下午全部

我已经尝试解决此问题一段时间了,将不胜感激。

这是我的数据框:

Channel state       rfq_qty
A        Done       10
B        Tied Done  10
C        Done       10
C        Done       10
C        Done       10
C        Tied Done  10
B        Done       10
B        Done       10



  我想要:
  
  
  按渠道分组,然后说明
  对每个通道的rfq_qty求和
  计算状态中每个“完成”字符串的出现次数(“完成”与“绑定完成”相同,即其中包含“完成”的任何内容)
  显示通道rfq_qty占rfq_qty总数的百分比(80)
  


Channel state   rfq_qty Percentage
A         1       10    0.125
B         3       30    0.375
C         4       40    0.5



  我尝试了以下方法:


df_Done = df[
                (
                    df['state']=='Done'
                ) 
                | 
                (
                    df['state'] == 'Tied Done'
                )
            ][['Channel','state','rfq_qty']]

df_Done['Percentage_Qty']= df_Done['rfq_qty']/df_Done['rfq_qty'].sum()
df_Done['Done_Trades']= df_Done['state'].count()

display(
        df_Done[
                (df_Done['Channel'] != 0)
               ].groupby(['Channel'])['Channel','Count of Done','rfq_qty','Percentage_Qty'].sum().sort_values(['rfq_qty'], ascending=False)
       )



  可行,但看起来令人费解。有什么改善吗?

最佳答案

我认为您可以使用:


首先按isinloc进行过滤
groupby并按agg进行汇总,并包含新列名称和函数的元组
Percentage除以divsum
如果需要,最后sort_values通过rfq_qty




df_Done = df.loc[df['state'].isin(['Done', 'Tied Done']), ['Channel','state','rfq_qty']]

#if want filter all values contains Done
#df_Done = df[df['state'].str.contains('Done')]

#if necessary filter out Channel == 0
#mask = (df['Channel'] != 0) & df['state'].isin(['Done', 'Tied Done'])
#df_Done = df.loc[mask, ['Channel','state','rfq_qty']]

d = {('rfq_qty', 'sum'), ('Done_Trades','size')}
df = df_Done.groupby('Channel')['rfq_qty'].agg(d).reset_index()
df['Percentage'] = df['rfq_qty'].div(df['rfq_qty'].sum())
df = df.sort_values('rfq_qty')
print (df)
  Channel  Done_Trades  rfq_qty  Percentage
0       A            1       10       0.125
1       B            3       30       0.375
2       C            4       40       0.500

相关文章:

python - 在Pandas数据框中将元素设置为None

python - 仅使用1-5%Tensorflow-gpu和Keras的GPU

python - 将列表元素插入列表列表的Pythonic方法? [重复]

python - 如何在Python3中检测concurrent.futures中的异常?

python - 字符串替换为多个项目

r - 从数据框中提取重复的行

javascript - Bokeh js通过单击将一个地块更改或重新渲染为另一地块

python - Python-在数据框中使用年和月创建新列

pandas - 熊猫中两个时间戳之间的差异

r - 通过R将大型数据帧存储在redis中