假設你想構建一個pd.DataFrame,並且每次增加複製數時都想獲得不同的數字。 (請在R中向下滾動以獲得可重現的示例)R的複製和do.call功能在Python中相當於
我想用Python獲得相同的輸出,但我不知道如何到達那裏!
如果你考慮這個簡單的pd.Dataframe
df = pd.DataFrame({
'a':[np.random.normal(0.27,0.01,5),np.random.normal(1,0.01,5)]})
df
a
0 [0.268297564096, 0.252974100195, 0.27613413347...
1 [0.996267313891, 1.00497494738, 1.022271644, 1...
我不知道爲什麼數據是這樣的。當我這樣做只有一個np.random.normal
我得到這個,
a
0 0.092309
1 0.085985
2 0.083635
3 0.081582
4 0.104096
對不起,我無法解釋這個behaviour.I我在pandas
新的,也許你可以解釋這一點。
好吧,讓我們回到原來的問題;
如果你想生成數字的第二組,我想我應該用np.repeat
df = pd.DataFrame({['a':np.repeat(np.random.normal(0.10,0.01,5),np.random.normal(0.10,0.01,5)])})
df
Out[59]:
a
0 0.090305
1 0.090305
2 0.109092
3 0.109092
4 0.101706
5 0.101706
6 0.087357
7 0.087357
8 0.099094
9 0.099094
10 0.101595
11 0.101595
12 0.100343
13 0.100343
14 0.085380
15 0.085380
16 0.102118
17 0.102118
18 0.107328
19 0.107328
但np.repeat只是產生兩次相同的數字是不是我想要的輸出。
這裏是R中的情況下的辦法,
df <- data.frame(y = do.call(c,replicate(n = 2,
expr = c(rnorm(5,0.10,0.01),rnorm(5,1,0.01)),
simplify = FALSE)),gr = rep(seq(1,2),each=10))
y gr
1 0.11300203 1
2 0.11840556 1
3 0.09420799 1
4 0.10480623 1
5 0.08561427 1
6 1.00076001 1
7 1.00035891 1
8 1.00936751 1
9 1.00050563 1
10 1.00564799 1
11 0.09415217 2
12 0.10794155 2
13 0.11534605 2
14 0.08806740 2
15 0.12394189 2
16 0.99330066 2
17 0.98254134 2
18 0.99828079 2
19 1.00786526 2
20 0.97864180 2
基本上在R您可以在非常簡單的做到這一點。但我想在Python中必須爲它寫一個函數。
在R您可以生成數正態分佈rnorm
和numpy
,我們可以做到這一點np.random.normal
。但我找不到任何內置功能,特別是do.call
。
我知道這比用'pandas'創建相同的數據框要複雜得多。我們可以添加'gr'列嗎? – Alexander
,如果你能解釋'for _ xrange(2)',我將不勝感激。在OP的第一部分中提到的事情有什麼理由嗎? – Alexander