【问题标题】:Find row with min/max value for each day in Pandas DataFrame在 Pandas DataFrame 中查找每天具有最小值/最大值的行
【发布时间】:2022-01-10 12:12:00
【问题描述】:

我有一个包含多天数据的数据框(为简洁起见,此处仅显示一天):

                       Charge
2022-01-03 13:19:02    99.5
2022-01-03 13:20:03    95.0
2022-01-03 13:21:02    64.2
2022-01-03 13:22:02    91.8
2022-01-03 13:23:02    99.5

我希望能够找到具有最小值和最大值的行,以便获得最小和最大充电的确切时间。如果有多个,我将只选择第一个出现。即:

                       Charge
2022-01-03 13:19:02    99.5
2022-01-03 13:21:02    64.2

我尝试过使用:

df_bat_chrg_min = df['Battery State of Charge'].groupby(df.index.day).min()
df_bat_chrg_max = df['Battery State of Charge'].groupby(df.index.day).max()
df_bat_chrg = pd.merge(df_bat_chrg_max, df_bat_chrg_min, left_index=True, right_index=True)

这会生成:

            Max Charge  Min Charge
2022-01-03  100.0       96.5

但是,索引名称不包括事件的确切时间,如第二个代码块所示。

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    使用DataFrameGroupBy.idxmaxDataFrameGroupBy.idxmin 按最小值和最大值进行索引,转换为 Series 并通过 DataFrame.loc 选择原始 DatetimeIndex

    df1 = (df.loc[df.groupby(df.index.day)['Charge']
                   .agg(['idxmin', 'idxmax']).stack()].sort_index())
    print (df1)
                         Charge
    2022-01-03 13:19:02    99.5
    2022-01-03 13:21:02    64.2
    

    如果需要聚合新列:

    df2 = df.groupby(df.index.day)['Charge'].agg(['min','max', 'idxmin', 'idxmax'])
    print (df2)
        min   max              idxmin              idxmax
    3  64.2  99.5 2022-01-03 13:21:02 2022-01-03 13:19:02
    

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多