class CADataFrame::ILocAccessor

Public Class Methods

new(dataframe) click to toggle source
# File lib/carray-dataframe/iloc_accessor.rb, line 5
def initialize (dataframe)
  @dataframe = dataframe
end

Public Instance Methods

[](*argv) click to toggle source
# File lib/carray-dataframe/iloc_accessor.rb, line 9
def [] (*argv)
  @dataframe.instance_eval {
    index = argv.first
    column_selector = select_columns(argv[1])
    columns = {}
    column_selector.each do |name|
      columns[name] = @column_data[name][index] ### df[...]
    end
    return CADataFrame.new(columns, index: @row_index ? @row_index[index] : nil)
  }
end
[]=(*argv) click to toggle source
# File lib/carray-dataframe/iloc_accessor.rb, line 21
def []= (*argv)
  value = argv.pop
  @dataframe.instance_eval {
    index = argv.first
    column_selector = select_columns(argv[1])
    case value
    when Hash          ### value = {"a"=> [1,2,3], ... }
      value = value.map{|k,v| [k.to_s, v]}.to_h
      column_selector.each do |name|
        @column_data[name][index] = value[name]
      end
    when Array
      case value.first
      when Hash        ### value = [{"a"=>1,"b"=>11}, {"a"=>2,""=>12} ...]
        table = {}
        column_selector.each do |name|
          table[name] = []
        end
        value.each do |hash|
          hash = hash.map{|k,v| [k.to_s, v]}.to_h
          column_selector.each do |name|
            table[name] << hash[name]
          end
        end
        column_selector.each do |name|
          @column_data[name][index] = table[name]
        end
      else             ### value = [[1,11],[2,12],...]
        value = value.transpose
        column_selector.each_with_index do |name, k|
          @column_data[name][index] = value[k]
        end
      end
    else               ### value = any value
      column_selector.each_with_index do |name, k|
        @column_data[name][index] = value
      end
    end
  }
end