【问题标题】:a new dataframe based on summary statistics of an existing dataframe基于现有数据框的汇总统计信息的新数据框
【发布时间】:2021-06-24 16:58:06
【问题描述】:

我有来自现有数据框的以下数据:

      Unnamed: 0         clOrdId                transactTime   symbol side  lastPx  lastQty
0              0  order__1000157     2021-05-28 09:45:54.923  1000157    S  0.9883     10.0
1              1  order__1000157     2021-05-28 09:45:23.500  1000157    S  0.9883     43.0
2              2  order__1000157     2021-05-28 09:26:38.129  1000157    S  0.9863     53.0
3              3  order__1000055     2021-05-28 09:24:16.837  1000055    S  0.9798     53.0
4              4  order__1000089     2021-05-28 09:24:11.027  1000089    B  0.9782     52.9
...          ...             ...                         ...      ...  ...     ...      ...
7296        5464  order-1AR1SCvx  2020-11-30 12:00:17.225000  1000065    B  0.9750    100.0
7297        5465  order-1AR1DUwx  2020-11-30 12:00:17.223000  1000065    B  0.9825    100.0
7298        5466  order-1AR1lQNx  2020-11-28 21:13:48.334000  1000114    S  0.9795     10.0
7299        5467  order-1AR1RvSx  2020-11-28 12:19:10.714000  1000065    S  1.0050    100.0
7300        5468  order-1AR1gSLx  2020-11-28 07:58:09.907000  1000065    B  0.9860    100.0

我想根据symbollastPx 列创建一个新的汇总统计数据框,这样对于每个交易品种,我都可以看到最后价格的平均值、标准差、最小值和最大值.

因此预期结果(示例数据)可能如下所示:

        symbol      min     max     mean    std
0       1000055     0.092   1.01    1.00    0.03
1       1000089     0.091   1.02    0.99    0.04
2       1000065     0.091   1.05    1.02    0.02
3       1000114     0.091   1.01    0.98    0.01
...     ...         ...     ...     ...     ...
5000    1000157     0.091   1.01    1.00    0.02
5001    1000158     0.091   1.02    1.00    0.03
5002    1000159     0.091   1.03    1.01    0.04

我遇到了df.describe(),但这似乎并没有按照我需要查看每个symbol 唯一列出的方式工作。我的替代方法是逐个重新创建一个新的数据帧,但这似乎不是最佳方法。

有没有一种快速(pythonic)的方式来实现这个?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    IIUC:

    通过groupby()agg()reset_index() 尝试:

    out=df.groupby('symbol')['lastPx'].agg(['min','max','mean','std']).reset_index()
    

    【讨论】:

    • 我已将此标记为正确答案,因为它似乎是建议的解决方案中最快和最简单的。
    • 后续问题:如果我想在本例中使用两列 9say symbolside 进行分组,请问这将如何实现?
    • @D.L 在这种情况下只需传递groupby() 方法中的列的listdf.groupby(['symbol','side'])['lastPx'].agg(['min','max','mean','std']).reset_index()
    【解决方案2】:
    df.pivot_table(index='symbol', aggfunc=['min','max','mean','std'], values ='lastPx')
    

    【讨论】:

    • 这是一个很好的答案,并产生了一个可行的解决方案(尚未测试速度),所以我赞成。但是,另一个答案(使用groupby() 似乎会产生一个平坦的df,因此使用起来可能会稍微容易一些......想知道您是否考虑过这一点或您的想法?
    • groupby() 方法似乎比 pivot_table 方法快 2 到 3 倍(对于 7000 行数据)。两者产生相同的结果
    猜你喜欢
    • 2014-04-09
    • 2018-08-11
    • 2019-08-18
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2020-01-30
    相关资源
    最近更新 更多