【问题标题】:Pandas df.resample with column-specific aggregation functionPandas df.resample 具有特定于列的聚合函数
【发布时间】:2017-11-01 12:56:30
【问题描述】:

使用 pandas.DataFrame.resample 我可以对 DataFrame 进行下采样:

df.resample("3s", how="mean")

这会使用类似日期时间的索引对数据框进行重新采样,以便 3 秒内的所有值汇总到一行中。列的值是平均的。

问题:我有一个包含多列的数据框。是否可以为不同的列指定不同的聚合函数,例如我想"sum"x"mean"y 并选择"last"z?我怎样才能达到这种效果?

我知道我可以创建一个新的空数据框,然后调用 resample 三次,但我更喜欢更快的就地解决方案。

【问题讨论】:

    标签: python pandas pandas-resample


    【解决方案1】:

    重采样后可以使用.agg。使用字典,您可以使用各种功能聚合不同的列。

    试试这个:

    df.resample("3s").agg({'x':'sum','y':'mean','z':'last'})
    

    另外,how 已弃用:

    C:\Program Files\Anaconda3\lib\site-packages\ipykernel__main__.py:1: FutureWarning:如何在 .resample() 中弃用新语法 .resample(...).mean()

    【讨论】:

    • 这里我们只使用每列一次。如果我想在同一列 x 上应用两个函数,在另一列 z 上应用不同的函数怎么办。
    • @KathirmaniSukumar 您可以使用列表来保存要对单个变量执行的所有函数。 df.resample('3s').agg({'X':['sum','mean'],'Y':'max','Z':['min','std']})
    • 当我尝试这个时,我收到以下警告:“FutureWarning:不推荐使用带有重命名的 dict,并将在未来的版本中删除”为什么它认为我在重命名列时只是想告诉它如何聚合给定的列?
    【解决方案2】:

    考虑数据框df

    np.random.seed([3,1415])
    tidx = pd.date_range('2017-01-01', periods=18, freq='S')
    df = pd.DataFrame(np.random.rand(len(tidx), 3), tidx, list('XYZ'))
    print(df)
    
                                X         Y         Z
    2017-01-01 00:00:00  0.444939  0.407554  0.460148
    2017-01-01 00:00:01  0.465239  0.462691  0.016545
    2017-01-01 00:00:02  0.850445  0.817744  0.777962
    2017-01-01 00:00:03  0.757983  0.934829  0.831104
    2017-01-01 00:00:04  0.879891  0.926879  0.721535
    2017-01-01 00:00:05  0.117642  0.145906  0.199844
    2017-01-01 00:00:06  0.437564  0.100702  0.278735
    2017-01-01 00:00:07  0.609862  0.085823  0.836997
    2017-01-01 00:00:08  0.739635  0.866059  0.691271
    2017-01-01 00:00:09  0.377185  0.225146  0.435280
    2017-01-01 00:00:10  0.700900  0.700946  0.796487
    2017-01-01 00:00:11  0.018688  0.700566  0.900749
    2017-01-01 00:00:12  0.764869  0.253200  0.548054
    2017-01-01 00:00:13  0.778883  0.651676  0.136097
    2017-01-01 00:00:14  0.544838  0.035073  0.275079
    2017-01-01 00:00:15  0.706685  0.713614  0.776050
    2017-01-01 00:00:16  0.542329  0.836541  0.538186
    2017-01-01 00:00:17  0.185523  0.652151  0.746060
    

    使用agg

    df.resample('3S').agg(dict(X='sum', Y='mean', Z='last'))
    
                                X         Y         Z
    2017-01-01 00:00:00  1.760624  0.562663  0.777962
    2017-01-01 00:00:03  1.755516  0.669204  0.199844
    2017-01-01 00:00:06  1.787061  0.350861  0.691271
    2017-01-01 00:00:09  1.096773  0.542220  0.900749
    2017-01-01 00:00:12  2.088590  0.313316  0.275079
    2017-01-01 00:00:15  1.434538  0.734102  0.746060
    

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2019-04-12
      • 2019-11-05
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多