我有一个大小为(19000x31)的数据框。我正在尝试计算每一行的均值。每行中的值范围从0到255。但是,我只想为每行在0到100之间的值计算平均值,即,不应考虑大于100的值进行平均值计算。我已经使用了DataFrame.Replace和DataFrame。这样做的意思。但是无法得到我所需要的。有什么我可以直接使用的函数,否则可以用NaN替换值并计算平均值。尝试更换时,我没有得到正确的更换。
答案 0 :(得分:0)
df[(df >= 0) & (df < 100)].mean(axis=1)
答案 1 :(得分:0)
自从您标记了numpy:
import numpy as np
# convert from dataframe to numpy array
a = df.to_numpy()
# create mask of "interest"
mask = np.logical_and(a>=0, a<=100)
# Compute row mean
(a*mask).sum(axis=1)/mask.sum(axis=1)
让我们比较一下numpy和pandas的表现:
import pandas as pd
import numpy as np
# create fake dataframe
df = pd.DataFrame(np.random.randint(0, 255, (19000, 31)))
def np_masked_row_mean(df, lower, upper):
# convert from dataframe to numpy array
a = df.to_numpy()
# create mask of "interest"
mask = np.logical_and(a>=lower, a<=upper)
# Compute row mean
return (a*mask).sum(axis=1)/mask.sum(axis=1)
%timeit df[(df >= 0) & (df < 100)].mean(axis=1)
131 ms ± 38.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit np_masked_row_mean(df, 0, 100)
8.06 ms ± 385 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
这使numpy的实现速度提高了15-16倍。