【问题标题】:Complex Groupby or Pivot Table Calculation in Python PandasPython Pandas 中的复杂 Groupby 或数据透视表计算
【发布时间】:2016-09-11 17:12:49
【问题描述】:

我有一个分组如下的数据框:

UNIT CA    DATE     SCP      TIME       LABEL       VALUES1      VALUES2           
R001 A058  08-01-13 01-00-00 01:00:00  REGULAR    340751.000   194975.000
                             05:00:00  REGULAR    340753.000   194975.000
                             09:00:00  REGULAR    341251.000   194984.000
                             09:39:56  REGULAR    341440.000   194994.000
                             13:00:00  REGULAR    341808.000   195061.000
                             17:00:00  REGULAR    342030.000   195295.000
                             21:00:00  REGULAR    342214.000   195659.000
                    01-00-01 01:00:00  REGULAR    245262.000   221709.000
                             05:00:00  REGULAR    245262.000   221709.000
                             09:00:00  REGULAR    245428.000   221742.000
                             09:39:56  REGULAR    245508.000   221754.000
                             13:00:00  REGULAR    245620.000   221856.000
                             17:00:00  REGULAR    245679.000   222178.000
                             21:00:00  REGULAR    245743.000   222604.000

我想为每个 SCP 提取 VALUE1 和 VALUE2 的最大值和最小值,计算差值,并以以下格式返回:

UNIT CA    DATE      SCP     DIFF OF MAX - MIN VALUE1   DIFF OF MAX - MIN VALUE2         
R001 A058  08-01-13 01-00-00        ....                         ....
                    01-00-01        ....                         ....

我不知道该怎么做。我相信一定有办法使用 groupby 或 pivot_table 来做到这一点。

提前致谢。

【问题讨论】:

    标签: python python-2.7 pandas group-by pivot-table


    【解决方案1】:

    IIUC,.groupby() 上的 level 应该可以工作。从您的示例数据开始:

    df.set_index(['UNIT', 'CA', 'DATE', 'SCP'], inplace=True)
    
    <class 'pandas.core.frame.DataFrame'>
    MultiIndex: 14 entries, (R001, A058, 2013-08-01 00:00:00, 01-00-00) to (R001, A058, 2013-08-01 00:00:00, 01-00-01)
    Data columns (total 4 columns):
    TIME       14 non-null object
    LABEL      14 non-null object
    VALUES1    14 non-null int64
    VALUES2    14 non-null int64
    dtypes: int64(2), object(2)
    
                                       TIME    LABEL  VALUES1  VALUES2
    UNIT CA   DATE       SCP                                          
    R001 A058 2013-08-01 01-00-00  01:00:00  REGULAR   340751   194975
                         01-00-00  05:00:00  REGULAR   340753   194975
                         01-00-00  09:00:00  REGULAR   341251   194984
                         01-00-00  09:39:56  REGULAR   341440   194994
                         01-00-00  13:00:00  REGULAR   341808   195061
                         01-00-00  17:00:00  REGULAR   342030   195295
                         01-00-00  21:00:00  REGULAR   342214   195659
                         01-00-01  01:00:00  REGULAR   245262   221709
                         01-00-01  05:00:00  REGULAR   245262   221709
                         01-00-01  09:00:00  REGULAR   245428   221742
                         01-00-01  09:39:56  REGULAR   245508   221754
                         01-00-01  13:00:00  REGULAR   245620   221856
                         01-00-01  17:00:00  REGULAR   245679   222178
                         01-00-01  21:00:00  REGULAR   245743   222604
    

    MultiIndex 级别上分组,并为两列中的每一列应用max()min() 的差异:

    df.groupby(level=['UNIT', 'CA', 'DATE', 'SCP'])['VALUES1', 'VALUES2'].apply(lambda x: x.max()-x.min())
    
                                   VALUES1  VALUES2
    UNIT CA   DATE       SCP                       
    R001 A058 2013-08-01 01-00-00     1463      684
                         01-00-01      481      895
    

    【讨论】:

    • 如何创建多索引?我试过阅读 Pandas 文档,但我不清楚。网上没有很多关于它的。谢谢。
    • 只需要设置多列作为索引-见示例代码开头的行:df.set_index(['UNIT', 'CA', 'DATE', 'SCP'], inplace=True)。如果要排序,有df.sortlevel()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2021-01-17
    • 2019-01-03
    • 2017-10-14
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多