gpt4 book ai didi

python - 使用其他列的索引对 DataFrame 进行切片

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:36 25 4
gpt4 key购买 nike

我有一个这样的数据框:

index   value   idxmin  idxmax
0 300 nan nan
1 200 nan nan
2 100 nan nan
3 200 0 2
4 300 1 2
5 400 1 3
6 500 2 5
7 600 4 5
8 700 4 7
9 800 5 8
10 900 5 8
11 800 7 9
12 700 8 10
13 600 10 12
14 500 12 13
15 400 12 14
16 500 12 15
17 400 13 15
18 500 13 16
19 600 15 17
20 700 15 19

我想创建一个新列 (maxvalue),它将返回行范围的“值”列的最大值。示例:对于第 9 行,第 5 行到第 8 行的“值”的最大值为 800。

我做了这段代码,其实可以运行但是效率不高

df['maxvalue'] = df.apply(lambda x : (df['value'].loc[x['idxmin']:x['idxmax']].max(), axis=1)

您是否有更高效的代码来执行该功能?

我期望的结果(最后一列):

index   value   idxmin  idxmax  maxvalue
0 300 nan nan nan
1 200 nan nan nan
2 100 nan nan nan
3 200 0 2 300
4 300 1 2 200
5 400 1 3 200
6 500 2 5 400
7 600 4 5 400
8 700 4 7 600
9 800 5 8 700
10 900 5 8 700
11 800 7 9 800
12 700 8 10 900
13 600 10 12 900
14 500 12 13 700
15 400 12 14 700
16 500 12 15 700
17 400 13 15 600
18 500 13 16 600
19 600 15 17 500
20 700 15 19 600

非常感谢您的帮助!!

最佳答案

这个操作本质上很难向量化,因为数组没有排序,而且索引似乎不代表相同大小的范围。我可以建议将其转换为列表推导式以规避 apply 的开销,但之后您就得靠自己了。

df['maxvalue'] = [
df['value'].values[int(s):int(e)].max() if pd.notna([s,e]).all()
else np.nan for s, e in zip(df['idxmin'], df['idxmax'])
]

df.head()
index value idxmin idxmax maxvalue
0 0 300 NaN NaN NaN
1 1 200 NaN NaN NaN
2 2 100 NaN NaN NaN
3 3 200 0.0 2.0 300.0
4 4 300 1.0 2.0 200.0

为了充分利用这一点,有必要将尽可能多的繁重工作从 pandas 转移到 numpy。我发现我的机器上只有一个 1000 行的小型 DataFrame 时速度提高了 15 倍。

df_ = df
df = pd.concat([df_] * 1000, ignore_index=True)

%timeit df.apply(
lambda x: df['value'].loc[x['idxmin']:x['idxmax']].max(), axis=1)
%%timeit
[
df['value'].values[int(s):int(e)].max() if pd.notna([s,e]).all()
else np.nan for s, e in zip(df['idxmin'], df['idxmax'])
]

4.79 s ± 68.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
268 ms ± 3.74 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 使用其他列的索引对 DataFrame 进行切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53725490/

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