根据每日列值折叠 pandas DataFrame

Collapse pandas DataFrame based on daily column value

我有一个 pandas DataFrame 每天有多个测量值(例如每小时测量值,但不一定是这种情况),但我只想保留某个列是每天的小时最小值。

我的一天在我的数据框中看起来有点像这样

    DATE                Value               Distance
17  1979-1-2T00:00:00.0 15.5669870447436    34.87
18  1979-1-2T01:00:00.0 81.6306803714536    31.342
19  1979-1-2T02:00:00.0 83.1854759740486    33.264
20  1979-1-2T03:00:00.0 23.8659679630303    32.34
21  1979-1-2T04:00:00.0 63.2755504429306    31.973
22  1979-1-2T05:00:00.0 91.2129044773733    34.091
23  1979-1-2T06:00:00.0 76.493130052689     36.837
24  1979-1-2T07:00:00.0 63.5443183375785    34.383
25  1979-1-2T08:00:00.0 40.9255407683688    35.275
26  1979-1-2T09:00:00.0 54.5583051827551    32.152
27  1979-1-2T10:00:00.0 26.2690011881422    35.104
28  1979-1-2T11:00:00.0 71.3059740399097    37.28
29  1979-1-2T12:00:00.0 54.0111262724049    38.963
30  1979-1-2T13:00:00.0 91.3518048568241    36.696
31  1979-1-2T14:00:00.0 81.7651763485069    34.832
32  1979-1-2T15:00:00.0 90.5695814525067    35.473
33  1979-1-2T16:00:00.0 88.4550315358515    30.998
34  1979-1-2T17:00:00.0 41.6276969038137    32.353
35  1979-1-2T18:00:00.0 79.3818377264749    30.15
36  1979-1-2T19:00:00.0 79.1672568582629    37.07
37  1979-1-2T20:00:00.0 1.48337999844262    28.525
38  1979-1-2T21:00:00.0 87.9110385474789    38.323
39  1979-1-2T22:00:00.0 38.6646421460678    23.251
40  1979-1-2T23:00:00.0 88.4920153764757    31.236

我想保留每天具有最小“距离”的所有行,因此对于上面显示的一天,将只剩下一行(索引值为 39 的那一行)。我知道如何折叠数据框,以便只剩下距离列。我可以做到这一点 - 如果我首先将 DATE 设置为索引 -

df_short = df.groupby(df.index.floor('D'))["Distance"].min()

但我还希望在最终结果中包含值列。如何保留所有列? 如果我这样做似乎不起作用

df_short = df.groupby(df.index.floor('D')).min(["Distance"])

这确实保留了最终结果中的所有列,但结果似乎是错误的,所以我不确定这是做什么的。 也许这已经发布在某个地方,但我找不到它。

您可以使用aggregate

df_short = df.groupby(df.index.floor('D')).agg({'Distance': min, 'Value': max})

如果您希望保留的 Value 列与最小 Distance 列相同:

df_short = df.loc[df.groupby(df.index.floor('D'))['Distance'].idxmin(), :]

创建日期时间索引:

df.DATE = pd.to_datetime(df.DATE) # If not already datetime.
df.set_index('DATE', inplace=True)

重新采样并找到最小距离的位置:

df.loc[df.resample('D')['Distance'].idxmin()]

输出:

                         Value  Distance
DATE
1979-01-02 22:00:00  38.664642    23.251