墨色风雨
本质上,R 中的命令apply(data, 2, var)在二维结构(如矩阵或数据帧)上运行(但不建议后者)以计算所有列的方差:数据框set.seed(73120)random_df <- data.frame( num1 = runif(500, 1, 100), num2 = runif(500, 1, 100), num3 = runif(500, 1, 100), num4 = runif(500, 1, 100), num5 = runif(500, 1, 100))apply(random_df, 2, var)# num1 num2 num3 num4 num5 # 822.9465 902.5558 782.4820 804.1448 830.1097 一旦which应用,命名向量(即一维数组)的索引将根据逻辑返回。which(apply(random_df, 2, var) > 900)# num2 # 2 矩阵set.seed(73120)random_mat <- replicate(5, runif(500, 1, 100))apply(random_mat, 2, var)# [1] 822.9465 902.5558 782.4820 804.1448 830.1097which(apply(random_mat, 2, var) > 900)# [1] 2熊猫在 Python 中,使用pandas(数据分析库),等效项也适用:DataFrame.apply轴设置为index在所有列上运行操作。等价地,您可以运行DataFrame.aggregate. 返回是一个熊猫系列,类似于 R 的命名向量作为一维数组。import numpy as npimport pandas as pdnp.random.seed(7312020)random_df = pd.DataFrame({'num1': np.random.uniform(1, 100, 500), 'num2': np.random.uniform(1, 100, 500), 'num3': np.random.uniform(1, 100, 500), 'num4': np.random.uniform(1, 100, 500), 'num5': np.random.uniform(1, 100, 500) })agg1 = random_df.apply('var', axis='index')print(agg1)# num1 828.538378# num2 810.755215# num3 820.480400# num4 811.728108# num5 885.514924# dtype: float64agg2 = random_df.aggregate('var')print(agg2)# num1 828.538378# num2 810.755215# num3 820.480400# num4 811.728108# num5 885.514924# dtype: float64R可以通过简单的括号(在 R 中也是可行的),或(保持原始尺寸)which来实现:[...].locwhereagg[agg > 850]# num5 885.514924# dtype: float64agg.loc[agg > 850]# num5 885.514924# dtype: float64agg.where(agg > 850)# num1 NaN# num2 NaN# num3 NaN# num4 NaN# num5 885.514924# dtype: float64麻木的另外使用 Python 的numpy(支持数组的数值计算库),您可以使用numpy.apply_along_axis. 并等同于 Pandas' var,相应地调整默认值ddof:random_arry = random_df.to_numpy()agg = np.apply_along_axis(lambda x: np.var(x, ddof=1), 0, random_arry)print(agg)# [828.53837793 810.75521479 820.48039962 811.72810753 885.51492378]print(agg[agg > 850])# [885.51492378]