亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 中的 R 命令“which(apply(data, 2, var)==0)”

Python 中的 R 命令“which(apply(data, 2, var)==0)”

三國紛爭 2023-04-18 15:11:23
我想知道如何編寫 R 命令which(apply(data, 2, var)==0)... 在 Python 中?,F在我正在嘗試運行 R 腳本來執行 PCA。但是,pca()只接受非常量列(=方差不為 0)。例如,只有 Col2 可以被接受為以下非常量列:Col1 Col2 Col30.0  1.2  4.00.0  1.5  4.00.0  1.3  4.00.0  1.1  4.0我以為我刪除了所有常量列。但是,我收到一個錯誤:> Error in prcomp.default(data, center = TRUE, scale = TRUE) :   cannot rescale a constant/zero column to unit variance我用谷歌搜索并找到了這個問題和 R 命令解決方案:which(apply(oopsmat, 2, var)==0)它對我有用。該命令指定哪些列仍然不變。因此,我手動刪除了列,R 腳本執行了 PCA?,F在我想在 Python 中做同樣的事情。你會如何用 Python 編寫這個 R 命令?#####################################################請不要閱讀下文,否則會浪費您的時間。我把這個作為我問了一個愚蠢問題的證據:注意:這個 R 命令很奇怪。正如我所說,我已經從我的數據中刪除了所有常量列。此 R 命令表明以下列的方差為 0(摘自大約 50,000 個數據)::  0  0  4  0  19  0  32  61  878  4  1  13  16  14  2  4  13  :  Excel 的差異命令的結果VAR.P是 231.4。這甚至不接近于 0!我不知道發生了什么,我在 Python 中找不到這樣的命令。所以,也請解釋一下這種奇怪的行為。*我忽略了刪除所有異常值的代碼,這就是為什么只剩下 0 的原因。
查看完整描述

1 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

本質上,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.1097


which(apply(random_mat, 2, var) > 900)

# [1] 2

熊貓

在 Python 中,使用pandas(數據分析庫),等效項也適用DataFrame.apply軸設置為index在所有列上運行操作。等價地,您可以運行DataFrame.aggregate.?返回是一個熊貓系列,類似于 R 的命名向量作為一維數組。

import numpy as np

import pandas as pd


np.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: float64


agg2 = random_df.aggregate('var')

print(agg2)

# num1? ? 828.538378

# num2? ? 810.755215

# num3? ? 820.480400

# num4? ? 811.728108

# num5? ? 885.514924

# dtype: float64

R可以通過簡單的括號(在 R 中也是可行的),或(保持原始尺寸)which來實現:[...].locwhere


agg[agg > 850]

# num5? ? 885.514924

# dtype: float64


agg.loc[agg > 850]

# num5? ? 885.514924

# dtype: float64


agg.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]


查看完整回答
反對 回復 2023-04-18
  • 1 回答
  • 0 關注
  • 354 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號