根据每日列值折叠 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
我有一个 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