gpt4 book ai didi

Python:每小时删除具有最大值的行

转载 作者:行者123 更新时间:2023-12-05 05:40:31 24 4
gpt4 key购买 nike

我有一个像这样的 pandas 数据框 df。

date                id      eng  math sci
2021-08-01 00:00:37 23 4.0 5.0 7.0
2021-08-01 00:05:37 23 4.0 4.0 5.0
2021-08-01 00:10:37 23 4.0 4.0 6.0
2021-08-01 00:15:38 23 4.0 4.0 5.0
2021-08-01 00:20:37 23 4.0 5.0 6.0
2021-08-01 00:25:37 23 4.0 5.0 7.0
... ... ... ... ...
2021-08-31 23:38:40 1995 4.0 4.0 5.0
2021-08-31 23:43:40 1995 4.0 4.0 4.0
2021-08-31 23:48:40 1995 4.0 5.0 5.0
2021-08-31 23:53:40 1995 4.0 4.0 4.0
2021-08-31 23:58:40 1995 4.0 5.0 7.0
1661089 rows × 4 columns

我想删除每小时具有最大 sci 值的行。每小时,我想删除 1 个最大 sci 值。如果像上面的情况那样每小时有 2 个最大值,则只删除第一行。

所以结果应该是这样的:

date                id      eng  math sci
2021-08-01 00:05:37 23 4.0 4.0 5.0
2021-08-01 00:10:37 23 4.0 4.0 6.0
2021-08-01 00:15:38 23 4.0 4.0 5.0
2021-08-01 00:20:37 23 4.0 5.0 6.0
2021-08-01 00:25:37 23 4.0 5.0 7.0
... ... ... ... ...
2021-08-31 23:38:40 1995 4.0 4.0 5.0
2021-08-31 23:43:40 1995 4.0 4.0 4.0
2021-08-31 23:48:40 1995 4.0 5.0 5.0
2021-08-31 23:53:40 1995 4.0 4.0 4.0

我的第一次尝试:

df_filtered = df.reset_index()
df_temp_max = (df_filtered.groupby(['id', pd.Grouper(key='date', freq='1H')])
.agg({'sci': 'max'})
.reset_index())
df_test_max = pd.Series(df_temp_max['sci'].values)
df_filtered.insert(5, 'sci_max', df_test_max, True)

我得到了:

        date                id      eng math  sci  sci_max
0 2021-08-01 00:00:37 23 4.0 5.0 7.0 7.0
1 2021-08-01 00:05:37 23 4.0 4.0 5.0 7.0
2 2021-08-01 00:10:37 23 4.0 4.0 6.0 7.0
3 2021-08-01 00:15:38 23 4.0 4.0 5.0 7.0
4 2021-08-01 00:20:37 23 4.0 5.0 6.0 7.0
... ... ... ... ... ... ...
1661084 2021-08-31 23:38:40 1995 4.0 4.0 5.0 NaN
1661085 2021-08-31 23:43:40 1995 4.0 4.0 4.0 NaN
1661086 2021-08-31 23:48:40 1995 4.0 5.0 5.0 NaN
1661087 2021-08-31 23:53:40 1995 4.0 4.0 4.0 NaN
1661088 2021-08-31 23:58:40 1995 4.0 5.0 7.0 NaN

当然,这不是真的。 NaN 值太多了。

我尝试使用 for 循环,但它花费了太多时间,而且如果我删除一行,也会出现索引错误。

你能帮我解决这个问题吗?非常感谢!

最佳答案

使用 idxmax 而不是 max 获取每组要删除的索引:

idx = df.groupby(['id', pd.Grouper(key='date', freq='H')])['sci'].idxmax()
out = df.drop(idx)

输出:

>>> idx
id date
23 2021-08-01 00:00:00 0
1995 2021-08-31 23:00:00 10
Name: sci, dtype: int64

>>> out
date id eng math sci
1 2021-08-01 00:05:37 23 4.0 4.0 5.0
2 2021-08-01 00:10:37 23 4.0 4.0 6.0
3 2021-08-01 00:15:38 23 4.0 4.0 5.0
4 2021-08-01 00:20:37 23 4.0 5.0 6.0
5 2021-08-01 00:25:37 23 4.0 5.0 7.0
6 2021-08-31 23:38:40 1995 4.0 4.0 5.0
7 2021-08-31 23:43:40 1995 4.0 4.0 4.0
8 2021-08-31 23:48:40 1995 4.0 5.0 5.0
9 2021-08-31 23:53:40 1995 4.0 4.0 4.0

关于Python:每小时删除具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72401499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com