读入数据帧索引最后一栏我有一个有3列 年龄,性别和速率数据帧朱莉娅由前一列
我想读的“速率”通过引用以前两列 说,(3,M)将返回0.0001885
在朱莉娅有没有什么聪明的方法来做到这一点?
(我希望该解决方案可以是通用的,无论我多么索引列都需要有,该解决方案可以处理此)
读入数据帧索引最后一栏我有一个有3列 年龄,性别和速率数据帧朱莉娅由前一列
我想读的“速率”通过引用以前两列 说,(3,M)将返回0.0001885
在朱莉娅有没有什么聪明的方法来做到这一点?
(我希望该解决方案可以是通用的,无论我多么索引列都需要有,该解决方案可以处理此)
创建一个样本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。
如果每次访问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上创建索引类似 - 使用模式,时间和内存限制应指导解决方案的选择。
@ Reza的解决方案(请参阅相关答案),例如,节省内存,保留在DataFrame世界中,并且非常清晰。 –
不错的解决方案,比我快 - 值得投票:P –
谢谢!非常明确:) – user3749678