我有一个大小为19000x31的数据帧。我正在尝试计算每一行的平均值。每行中的值范围从0到255。但是,我只想为每一行计算0到100之间的值的平均值,也就是说,平均值的计算不应考虑大于100的值。我用过DataFrame.Replace和DataFrame。我的意思是这样做。但是不能得到我需要的东西。有没有什么函数可以直接用来做这件事,或者有没有可能用NaN替换这些值并计算平均值。当我尝试替换时,我没有得到正确的替换。
发布于 2020-05-08 07:12:18
由于您标记了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倍。
发布于 2020-05-08 06:12:41
df[(df >= 0) & (df < 100)].mean(axis=1)
https://stackoverflow.com/questions/61672275
复制相似问题