在 Pandas DataFrame 中的每一天查找具有 min/max 值的行
Find row with min/max value for each day in Pandas DataFrame
我有一个包含多天数据的数据框(为简洁起见,此处仅显示一天):
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
我希望能够找到具有最小值和最大值的行,以便我可以获得最小值和最大值充电的准确时间。如果有多个,我会 select 第一个出现。即:
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
然而,索引名称不包括事件的确切时间,如第二个代码块中所示。
使用DataFrameGroupBy.idxmax
和
DataFrameGroupBy.idxmin
for indices by minimal and maximal values, convert to Series
and select original DatetimeIndex
by DataFrame.loc
:
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
我有一个包含多天数据的数据框(为简洁起见,此处仅显示一天):
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
我希望能够找到具有最小值和最大值的行,以便我可以获得最小值和最大值充电的准确时间。如果有多个,我会 select 第一个出现。即:
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
然而,索引名称不包括事件的确切时间,如第二个代码块中所示。
使用DataFrameGroupBy.idxmax
和
DataFrameGroupBy.idxmin
for indices by minimal and maximal values, convert to Series
and select original DatetimeIndex
by DataFrame.loc
:
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