我有一个熊猫数据框架,它看起来像这样:
Concentr 1 Concentr 2 Time
0 25.4 0.48 00:01:00
1 26.5 0.49 00:02:00
2 25.2 0.52 00:03:00
3 23.7 0.49 00:04:00
4 23.8 0.55 00:05:00
5 24.6 0.53 00:06:00
6 26.3 0.57 00:07:00
7 27.1 0.59 00:08:00
8 28.8 0.56 00:09:00
9 23.9 0.54 00:10:00
10 25.6 0.49 00:11:00
11 27.5 0.56 00:12:00
12 26.3 0.55 00:13:00
13 25.3 0.54 00:14:00
,我想保留每5分钟间隔的浓度1的最大值,以及它发生的时间和当时浓度2的值。因此,对于前面的例子,我希望有:
Concentr 1 Concentr 2 Time
0 26.5 0.49 00:02:00
1 28.8 0.56 00:09:00
2 27.5 0.56 00:12:00
我目前的方法是i)为每个5分钟间隔创建一个ID的辅助变量,例如00:00到00:05将是间隔1,从00:05到00:10将是间隔2等,ii)在一个组中使用间隔变量来获得每个间隔的最大浓度1,iii)合并回初始df使用间隔变量和浓度1,从而识别相应的时间。
我想问是否有更好/更有效/更优雅的方法来做这件事。
非常感谢你的帮助。
您可以执行常规的重新抽样/分组,并使用idxmax
方法获得每个组所需的行。然后用它来索引原始数据:
>>> df.loc[df.resample('5T', on='Time')['Concentr1'].idxmax()]
Concentr 1 Concentr 2 Time
1 26.5 0.49 2021-10-09 00:02:00
8 28.8 0.56 2021-10-09 00:09:00
11 27.5 0.56 2021-10-09 00:12:00
这是假设您的'Time'
列与pd.to_datetime
类似的日期时间。您可以使用strftime
将时间列转换回来。完整的:
df['Time'] = pd.to_datetime(df['Time'])
result = df.loc[df.resample('5T', on='Time')['Concentr1'].idxmax()]
result['Time'] = result['Time'].dt.strftime('%H:%M:%S')
给:
Concentr1 Concentr2 Time
1 26.5 0.49 00:02:00
8 28.8 0.56 00:09:00
11 27.5 0.56 00:12:00
df = df.set_index('Time')
idx = df.resample('5T').agg({'Concentr 1': np.argmax})
df = df.iloc[idx.conc]
那么你可能需要reset_index()
,如果你不希望时间作为你的索引。
你也可以这样使用:
groupby everyn=5根据" concentration 1">
的max索引对原始df进行缩小和过滤。df = df[df.index.isin(df.groupby(df.index // 5)["Concentr 1"].idxmax())]
print(df)
输出:
Concentr 1 Concentr 2 Time
1 26.5 0.49 00:02:00
8 28.8 0.56 00:09:00
11 27.5 0.56 00:12:00