gpt4 book ai didi

python - 如何在考虑行子集的同时遍历 Pandas DataFrame

转载 作者:行者123 更新时间:2023-11-28 16:56:40 24 4
gpt4 key购买 nike

考虑这样一个 DataFrame:

size = 10
d = {
'id': np.random.randint(1, 10, size),
'value': np.random.randint(10, 100, size)
}
df = pd.DataFrame(data=d)

# Now for each row I'm counting how many previous other rows have the same id
df['others_count'] = df.groupby(['id']).cumcount()+1

产生这样的东西:

   id  value  others_count
0 3 76 1
1 4 12 1
2 1 96 1
3 6 33 1
4 4 49 2
5 8 72 1
6 8 68 2
7 7 78 1
8 9 99 1
9 1 66 2

对于至少与另一行共享其 id 的行(在我的示例 4、6 和 9 中),我必须添加另一列,其中包含 值的平均值上方属于该 ID 的所有行。

我提出了这个效率相当低的解决方案,我怀疑它也有某种缺陷:

for row in range(0, df.shape[0]):
if df['id'][row] > 1:
address = df['id'][row]
others = df['others_count'][row]
df.loc[row, 'value_estimated'] = df.loc[(df['id']==address)&(df['others_count']<others), 'value'].mean()

这给出了这个输出:

   id  value  others_count  value_estimated
0 3 76 1 NaN
1 4 12 1 NaN
2 1 96 1 NaN
3 6 33 1 NaN
4 4 49 2 12.0
5 8 72 1 NaN
6 8 68 2 72.0
7 7 78 1 NaN
8 9 99 1 NaN
9 1 66 2 NaN

第 4 行和第 8 行是正确的,但最后一行不正确,value_estimated 应为 96。

您对此有更好的解决方案吗?

最佳答案

IIUC,您可以在 idexpanding 上使用 groupby 来执行此操作mean() 使用 shift 将值向下移动 1。:

df['value_estimated']=df.groupby('id')['value'].apply(lambda x: 
x.expanding().mean().shift())
print(df)

   id  value  others_count  value_estimated
0 3 76 1 NaN
1 4 12 1 NaN
2 1 96 1 NaN
3 6 33 1 NaN
4 4 49 2 12.0
5 8 72 1 NaN
6 8 68 2 72.0
7 7 78 1 NaN
8 9 99 1 NaN
9 1 66 2 96.0

关于python - 如何在考虑行子集的同时遍历 Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729564/

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