【问题标题】:after groupby and sum,how to get the max value rows in `pandas.DataFrame`?在 groupby 和 sum 之后,如何获取“pandas.DataFrame”中的最大值行?
【发布时间】:2015-07-23 08:05:34
【问题描述】:

这里是df(我用真实数据更新):

>TIMESTAMP          OLTPSOURCE      RNR                         RQDRECORD
>20150425232836     0PU_IS_PS_44    REQU_51NHAJUV06IMMP16BVE572JM2  17020
>20150128165726     ZFI_DS41        REQU_50P1AABLYXE86KYE3O6EY390M  6925
>20150701144253     ZZZJB_TEXT      REQU_52DV5FB812JCDXDVIV9P35DGM  2
>20150107201358     0EQUIPMENT_ATTR     REQU_50EVHXSDOITYUQLP4L8UXOBT6  14205
>20150623215202     0CO_OM_CCA_1     REQU_528XSXYWTK6FSJXDQY2ROQQ4Q 0
>20150715144139     0HRPOSITION_TEXT    REQU_52I9KQ1LN4ZWTNIP0N1R68NDY  25381
>20150625175157     0HR_PA_0    REQU_528ZS1RFN0N3Y3AEB48UDCUKQ  100020
>20150309153828     0HR_PA_0    REQU_51385K5F3AGGFVCGHU997QF9M  0
>20150626185531     0FI_AA_001  REQU_52BO3RJCOG4JGHEIIZMJP9V4A  0
>20150307222336     0FUNCT_LOC_ATTR REQU_513JJ6I6ER5ZVW5CAJMVSKAJQ  13889
>20150630163419     0WBS_ELEMT_ATTR REQU_52CUPVUFCY2DDOG6SPQ1XOYQ2  0
>20150424162226     6DB_V_DGP_EXPORTDATA    REQU_51N1F5ZC8G3LW68E4TFXRGH9I  0
>20150617143720     ZRZMS_TEXT  REQU_5268R1YE6G1U7HUK971LX1FPM  6
>20150405162213     0HR_PA_0    REQU_51FFR7T4YQ2F766PFY0W9WUDM  0
>20150202165933     ZFI_DS41    REQU_50QPTCF0VPGLBYM9MGFXMWHGM  6925
>20150102162140     0HR_PA_0    REQU_50CNUT7I9OXH2WSNLC4WTUZ7U  0
>20150417184916     0FI_AA_004  REQU_51KFWWT6PPTI5X44D3MWD7CYU  0
>20150416220451     0FUNCT_LOC_ATTR REQU_51JP3BDCD6TUOBL2GK9ZE35UU  13889
>20150205150633     ZHR_DS09    REQU_50RFRYRADMA9QXB1PW4PRF5XM  6667
>20150419230724     0PU_IS_PS_44    REQU_51LC5XX6VWEERAVHEFJ9K5A6I  22528

>and the relationships between columns is
>OLTPSOURCE--RNR:1>n
>RNR--RQDRECORD:1>N

我的要求是:

  1. 将 RQDRECORD 与 RNR 相加;
  2. 获取每个OLTPSOURCE的最大总和结果;
  3. 最后,我会画一个图表来显示所有的结果 按时间求和最大的 OLTPSOURCE

谢谢大家,我进一步解释我的问题:

  1. 如果 OLTPSOURCE:RNR:RQDRECORD= 1:1:1

    只需将 RQDRECORD、RETURN OLTPSOURCE 和 SUM RESULT 相加

  2. 如果 OLTPSOURCE:RNR:RQDRECORD= 1:1:N

    只需将 RQDRECORD、RETURN OLTPSOURCE 和 SUM RESULT 相加

  3. 如果 OLTPSOURCE:RNR:RQDRECORD= 1:N:(N OR 1)

    先按RNR GROUP求和RQDRECORD,然后找到一个OLTPSOURCE的最大结果,返回所有具有最大RQDRECORD的OLTPSOURCE。

所以对于上面的示例数据,我最终想要的结果如下

>TIMESTAMP  OLTPSOURCE  RNR RQDRECORD
>20150623215202     0CO_OM_CCA_1    REQU_528XSXYWTK6FSJXDQY2ROQQ4Q  0
>20150107201358     0EQUIPMENT_ATTR REQU_50EVHXSDOITYUQLP4L8UXOBT6  14205
>20150626185531     0FI_AA_001  REQU_52BO3RJCOG4JGHEIIZMJP9V4A  0
>20150417184916     0FI_AA_004  REQU_51KFWWT6PPTI5X44D3MWD7CYU  0
>20150416220451     0FUNCT_LOC_ATTR REQU_51JP3BDCD6TUOBL2GK9ZE35UU  13889
>20150625175157     0HR_PA_0    REQU_528ZS1RFN0N3Y3AEB48UDCUKQ  100020
>20150715144139     0HRPOSITION_TEXT    REQU_52I9KQ1LN4ZWTNIP0N1R68NDY  25381
>20150419230724     0PU_IS_PS_44    REQU_51LC5XX6VWEERAVHEFJ9K5A6I  22528
>20150630163419     0WBS_ELEMT_ATTR REQU_52CUPVUFCY2DDOG6SPQ1XOYQ2  0
>20150424162226     6DB_V_DGP_EXPORTDATA    REQU_51N1F5ZC8G3LW68E4TFXRGH9I  0
>20150202165933     ZFI_DS41    REQU_50QPTCF0VPGLBYM9MGFXMWHGM  6925
>20150205150633     ZHR_DS09    REQU_50RFRYRADMA9QXB1PW4PRF5XM  6667
>20150617143720     ZRZMS_TEXT  REQU_5268R1YE6G1U7HUK971LX1FPM  6
>20150701144253     ZZZJB_TEXT  REQU_52DV5FB812JCDXDVIV9P35DGM  2

参考EdChum的做法,我做了一些调整,结果如下,因为数据量太大,我做了“'RQDRECORD> 100000'”设置,其实我想先排序再取前 100 名,但没有成功

[1]:http://i.imgur.com/FgfZaDY.jpg“结果”

【问题讨论】:

  • 哇,只是发布你之前的内容,只是明确说明你有一个时间戳索引。
  • 对不起,我是新人
  • 每个问题应该是 1 个问题,您还声明您想按“RNR”求和,但在您的示例数据中它们都是独一无二的,您应该能够修改我的答案以获得您想要的,由于某种原因,您会丢失时间戳,但最好不要将其设置为索引,然后在合并后将其设置为索引

标签: python pandas dataframe


【解决方案1】:

您可以获取 groupby 结果,在此调用 max 并传递参数 level=0level='clsa' 如果您愿意,这将返回您该级别的最大计数。但是,这会丢失 'clsb' 列,因此您可以做的是 merge 在对分组对象调用 reset_index 后将其返回到分组结果,您可以使用花哨的索引对生成的 df 列重新排序:

In [149]:
gp = df.groupby(['clsa','clsb']).sum()
result = gp.max(level=0).reset_index().merge(gp.reset_index())
result = result.ix[:,['clsa','clsb','count']]
result

Out[149]:
  clsa clsb  count
0    a   a1      9
1    b   b2      8
2    c   c2     10

【讨论】:

  • 谢谢!但我只想获得每个分组的最大前一个结果
  • 不好意思没说清楚,其实有一个timestamp列作为索引,如果使用re_index,就失效了原来的索引。原来的DF就是这四列:time ,clsa,clsb,count,我曾经做过“df.set_index('time',inplace=True)”
  • 如果您实际发布了您的数据是什么样的以及您真正想要什么,这将有所帮助
  • 嗨,EdChum,我更新了我的问题,请帮我再看看
【解决方案2】:
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'], format='%Y%m%d%H%M%S')
df_gb = df.groupby(['OLTPSOURCE', 'RNR'], as_index=False).aggregate(sum)
final = pd.merge(df[['TIMESTAMP', 'OLTPSOURCE', 'RNR']], df_gb.groupby(['OLTPSOURCE'], as_index=False).first(), on=['OLTPSOURCE', 'RNR'], how='right').sort('OLTPSOURCE')
final.plot(kind='bar')
plt.show()


print final

             TIMESTAMP            OLTPSOURCE                             RNR  \
3  2015-06-23 21:52:02          0CO_OM_CCA_1  REQU_528XSXYWTK6FSJXDQY2ROQQ4Q   
2  2015-01-07 20:13:58       0EQUIPMENT_ATTR  REQU_50EVHXSDOITYUQLP4L8UXOBT6   
5  2015-06-26 18:55:31            0FI_AA_001  REQU_52BO3RJCOG4JGHEIIZMJP9V4A   
11 2015-04-17 18:49:16            0FI_AA_004  REQU_51KFWWT6PPTI5X44D3MWD7CYU   
6  2015-03-07 22:23:36       0FUNCT_LOC_ATTR  REQU_513JJ6I6ER5ZVW5CAJMVSKAJQ   
4  2015-07-15 14:41:39      0HRPOSITION_TEXT  REQU_52I9KQ1LN4ZWTNIP0N1R68NDY   
10 2015-01-02 16:21:40              0HR_PA_0  REQU_50CNUT7I9OXH2WSNLC4WTUZ7U   
13 2015-04-19 23:07:24          0PU_IS_PS_44  REQU_51LC5XX6VWEERAVHEFJ9K5A6I   
7  2015-06-30 16:34:19       0WBS_ELEMT_ATTR  REQU_52CUPVUFCY2DDOG6SPQ1XOYQ2   
8  2015-04-24 16:22:26  6DB_V_DGP_EXPORTDATA  REQU_51N1F5ZC8G3LW68E4TFXRGH9I   
0  2015-01-28 16:57:26              ZFI_DS41  REQU_50P1AABLYXE86KYE3O6EY390M   
12 2015-02-05 15:06:33              ZHR_DS09  REQU_50RFRYRADMA9QXB1PW4PRF5XM   
9  2015-06-17 14:37:20            ZRZMS_TEXT  REQU_5268R1YE6G1U7HUK971LX1FPM   
1  2015-07-01 14:42:53            ZZZJB_TEXT  REQU_52DV5FB812JCDXDVIV9P35DGM   

    RQDRECORD  
3           0  
2       14205  
5           0  
11          0  
6       13889  
4       25381  
10          0  
13      22528  
7           0  
8           0  
0        6925  
12       6667  
9           6  
1           2 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2021-11-11
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多