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