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

标签 python-3.x numpy pandas

我有一个 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/

相关文章:

python - 用 Python 优化 Deadfish 常数计算器

python-3.x - 对 S3 中的多个文件执行 lambda 函数

python - 使用 matplotlib 的动态图在一段时间后变慢

python - 对于很长的数据库,有没有办法知道 panda `to_csv` 的状态?

python - 如何将用户输入变量传递给Sqlalchemy语句?

python - 尝试保存 tkInter 比例的值

python - 如何根据列将 numpy 数组拆分为 numpy 数组?

python - 用索引从数组中填充 1D numpy 数组

python - Numpy loadtxt 四舍五入数字

pandas - 通过排除某些词汇更快地加载 fasttext 模型