gpt4 book ai didi

python-3.x - 计算 Pandas 中的条件均值

转载 作者:行者123 更新时间:2023-12-01 02:34:56 29 4
gpt4 key购买 nike

我有一个 Pandas 数据框如下:

import pandas as pd
data = pd.DataFrame([[1, 1, 100], [1, 2, 101], [1, 3, 102],
[2, 1, 103], [2, 2, 104], [2, 3, 105],
[3, 1, 106] ,[3, 2, 107], [3, 3, 108]],
columns=['row', 'column', 'cell value'])

每行数据代表一个单元格的值和位置(按“行”和“列”)。我希望做的是计算每个单元格的相邻单元格的平均单元格值。例如,对于单元格 (row==2 column==2),我需要计算的单元格平均值:

  • 单元格值(行==1,列==2)
  • 单元格值(行==3,列==2)
  • 单元格值(行==2,列==1)
  • 单元格值(行==2,列==3)

我需要将此计算应用于每个单元格。

我有以下定义的函数:

此函数提取特定单元格的单元格值:

def val(r,c):
return float(data['cell value'][(data['row'] == r) & (data['column'] == c)])

此函数提取相邻的单元格值:

def adjval(r,c): 
adj = []
if r != data['row'].max():
adj.append(thick(r + 1, c))
if r!=1:
adj.append(thick(r - 1, c))
if c!=data['column'].max():
adj.append(thick(r, c + 1))
if c!=1:
adj.append(thick(r, c - 1))
return adj

但后来我努力寻找一种方法将此函数应用于数据框中的每个单元格。我尝试了 iterrows 但它非常慢,因为实际数据集非常大。

任何关于我如何继续前进的建议都将不胜感激。

最佳答案

正如@Paul 建议的那样,您可能想在这里使用 numpy。 Numpy 是 pandas 的依赖项,无论是单独学习还是作为 pandas 的伴侣都非常值得学习。对于您并不真正需要 pandas 的附加功能的情况,numpy 解决方案可以更快。这是其中一个案例。

其中最棘手的部分是拐角和边缘,我通过在外面放置一圈 NaN 来处理它们。结合 np.nanmean(而不是 np.mean),这将使分母在计算均值时保持正确。可能有(也可能没有)更优雅的方法来执行此操作,尽管它目前已经是一个相当简洁的答案。

import numpy as np

arr = np.empty([5,5])
arr[:] = np.nan
arr[1:4,1:4] = np.arange(100,109).reshape(3,3)

或者,如果您需要将原始数据帧转换为 numpy 数组,则可以将最后一行替换为:

arr[1:4,1:4] = data.set_index(['row','column']).unstack().values

现在你的数组看起来像这样。

array([[  nan,   nan,   nan,   nan,   nan],
[ nan, 100., 101., 102., nan],
[ nan, 103., 104., 105., nan],
[ nan, 106., 107., 108., nan],
[ nan, nan, nan, nan, nan]])

np.nanmean 就是您之后所需要的。

np.nanmean( np.array( [ arr[1-1:4-1,1:4], arr[1:4,1-1:4-1], 
arr[1+1:4+1,1:4], arr[1:4,1+1:4+1] ] ), axis=0 )

array([[ 102. , 102. , 103. ],
[ 103.33333333, 104. , 104.66666667],
[ 105. , 106. , 106. ]])

关于python-3.x - 计算 Pandas 中的条件均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282097/

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