Julia按上一列读取数据帧索引中的最后一列

Julia按上一列读取数据帧索引中的最后一列,julia,Julia,我有一个数据框,它有3列 年龄、性别和比率 我想通过参考前两列来阅读“Rate” 假设,(3,M)将返回0.0001885 在朱莉娅身上有什么聪明的方法可以做到这一点吗 (我希望这个解决方案可以是通用的,无论我需要多少索引列,这个解决方案都可以处理这个问题)创建一个示例DataFrame julia> df = DataFrame(Age = rand(1:100,10), Sex = rand(['M','F'],10), Rate = ran d(10)) 10x3 DataFram

我有一个数据框,它有3列 年龄、性别和比率

我想通过参考前两列来阅读“Rate” 假设,(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.

如果每次都通过相同的列访问数据帧,则从索引到值的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

可以为其他访问组合生成额外的dict。这类似于在数据库上创建索引-使用模式、时间和内存限制应该指导解决方案的选择。

@Reza的解决方案(参见相关答案),例如,节省内存,保持在
数据框中,并且非常清晰。好的解决方案和比我更快的解决方案值得投票:p