2016-01-23 190 views
1

讀入數據幀索引最後一欄我有一個有3列 年齡,性別和速率數據幀朱莉婭由前一列

see dataframe

我想讀的「速率」通過引用以前兩列 說,(3,M)將返回0.0001885

在朱莉婭有沒有什麼聰明的方法來做到這一點?

(我希望該解決方案可以是通用的,無論我多麼索引列都需要有,該解決方案可以處理此)

回答

3

創建一個樣本DataFrame

julia> df = DataFrame(Age = rand(1:100,10), Sex = rand(['M','F'],10), Rate = ran 
d(10)) 
10x3 DataFrames.DataFrame 
| Row | Age | Sex | Rate  | 
|-----|-----|-----|------------| 
| 1 | 2 | 'F' | 0.0125987 | 
| 2 | 81 | 'F' | 0.0538013 | 
| 3 | 3 | 'M' | 0.885425 | 
| 4 | 92 | 'M' | 0.00412666 | 
| 5 | 70 | 'M' | 0.113444 | 
| 6 | 37 | 'M' | 0.845769 | 
| 7 | 47 | 'M' | 0.234437 | 
| 8 | 68 | 'M' | 0.791475 | 
| 9 | 46 | 'M' | 0.831009 | 
| 10 | 30 | 'M' | 0.812764 | 

要選擇基於行在多個條件:

julia> df[(df[:Age].==47) & (df[:Sex].=='M'),:] 
1x3 DataFrames.DataFrame 
| Row | Age | Sex | Rate  | 
|-----|-----|-----|----------| 
| 1 | 47 | 'M' | 0.234437 | 

爲了通過ID選擇列:

julia> df[(df[:Age].>47) & (df[:Sex].=='M'),3] 
3-element DataArrays.DataArray{Float64,1}: 
0.00412666 
0.113444 
0.791475 

要選擇最後一欄:

julia> df[(df[:Age].>47) & (df[:Sex].=='M'),end] 
3-element DataArrays.DataArray{Float64,1}: 
0.00412666 
0.113444 
0.791475 

選擇多列:

julia> df[(df[:Age].>47) & (df[:Sex].=='M'),[1,3]] 
3x2 DataFrames.DataFrame 
| Row | Age | Rate  | 
|-----|-----|------------| 
| 1 | 92 | 0.00412666 | 
| 2 | 70 | 0.113444 | 
| 3 | 68 | 0.791475 | 

而且它可以做到用柱符號例如同樣的事情:Rate而不是id。

+0

不錯的解決方案,比我快 - 值得投票:P –

+0

謝謝!非常明確:) – user3749678

1

如果每次訪問DataFrame都是通過相同的列完成的,則從索引到值的Dict是更快(也許更清晰)的解決方案。爲了澄清,在你的榜樣,它會是這樣的:可以爲其他接入組合產生

df = DataFrame(Age=[0,1,2,3,4,5,6], 
       Sex=UTF8String["M","M","M","M","M","M","M"], 
       Rate=[0.0031934,0.0002601,0.0002215, 
        0.0001885,0.000161,0.0001391,0.0001226]) 

# define Dict from :Age,:Sex => :Rate 
d = Dict(zip((zip(df[:Age],df[:Sex])),df[:Rate])) 

# now we have: 
d[(3,"M")] == 0.0001885 
d[(0,"M")] == 0.0031934 

附加日文N3 N4 N5。這與在DB上創建索引類似 - 使用模式,時間和內存限制應指導解決方案的選擇。

+0

@ Reza的解決方案(請參閱相關答案),例如,節省內存,保留在DataFrame世界中,並且非常清晰。 –