我有一个这样的DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame({
"realization_id": np.repeat([0, 1], 6),
"sample_size": np.tile([0, 1, 2], 4),
"num_obs": np.tile(np.repeat([25, 100], 3), 2),
"accuracy": [0.8, 0.7, 0.8, 0.6, 0.7, 0.5, 0.6, 0.7, 0.8, 0.7, 0.9, 0.7],
"prob": [0.94, 0.96, 0.95, 0.98, 0.93, 0.92, 0.90, 0.92, 0.95, 0.9, 0.91, 0.92]
})
df["accum_max_prob"] = df.groupby(["realization_id", "num_obs"])["prob"].cummax()
我想知道如何创建一个输出如下的列:
df["desired_accuracy"] = [0.8, 0.7, 0.7, 0.6, 0.6, 0.6, 0.6, 0.7, 0.8, 0.7, 0.9, 0.7]
desired_accuracy
的每个条目都等于accuracy
的值,该值对应于迄今为止按组实现的最高prob
的行(这就是我创建accum_max_prob
的原因)。
例如:第一个值是0.8
,因为在此之前没有数据,但是下一个值是0.7
,因为第二行的prob
大于第一行。第三个值保持不变,因为第三个prob
低于第二个,所以它不更新desired_accuracy
。对于每对(realization_id, num_obs)
,标准重置。
如何使用Pandas以矢量化的方式实现这一目标?
4条答案
按热度按时间3vpjnl9f1#
它看起来像:
输出:
bz4sfanl2#
尝试:
图纸:
91zkwejq3#
只要保持
prob
和accum_max_prob
相等的值,以及ffill
:请注意,您不需要每组
ffill
,**前提是prob
中最初没有缺失值。**如果存在缺失值,则使用df['accuracy'].where(df['accum_max_prob'].eq(df['prob'])).groupby([df["realization_id"], df["num_obs"]]).ffill()
输出:
luaexgnf4#
这样做:
df['desired_accuracy ']= df['accuracy']。where(df['accum_max_prob'].eq(df['prob']))。填充