def insert_column(*args, &block)
      if block_given?
        rows = []
        name = args[0]
        self.each_row do |row|
          val = row.instance_eval(&block)
          row[name] = val
          rows.push(row)
        end
        @data = rows.map{|row| row.to_hash.values}.transpose.map do |arr|
          Mikon::DArray.new(arr)
        end
        @labels = rows.first.labels
      else
        if args[0].is_a?(Symbol)
          name = args[0]
          case
          when args[1].is_a?(Mikon::DArray)
            @data.push(args[1])
          when args[1].is_a?(Mikon::Series)
            @data.push(args[1].to_darr)
          when args[1].is_a?(Array)
            @data.push(Mikon::DArray.new(args[1]))
          else
            raise ArgumentError
          end
        elsif args[0].is_a?(Mikon::Series)
          @data.push(args[0].to_darr)
          name = args[0].name
        end
        @labels.push(name)
      end
      _check_if_valid
      return self
    end
def insert_column(*args, &block)
      if block_given?
        rows = []
        name = args[0]
        self.each_row do |row|
          val = row.instance_eval(&block)
          row[name] = val
          rows.push(row)
        end
        @data = rows.map{|row| row.to_hash.values}.transpose.map do |arr|
          Mikon::DArray.new(arr)
        end
        @labels = rows.first.labels
      else
        if args[0].is_a?(Symbol)
          name = args[0]
          case
          when args[1].is_a?(Mikon::DArray)
            @data.push(args[1])
          when args[1].is_a?(Mikon::Series)
            @data.push(args[1].to_darr)
          when args[1].is_a?(Array)
            @data.push(Mikon::DArray.new(args[1]))
          else
            raise ArgumentError
          end
        elsif args[0].is_a?(Mikon::Series)
          @data.push(args[0].to_darr)
          name = args[0].name
        end
        @labels.push(name)
      end
      _check_if_valid
      return self
    end
Insert column using Mikon::Row DSL or raw Array
 @param [label] Symbol the name of new column (optional)
 @param [Array|Series|DArray] the content of new column (optional)
 @example
   df = Mikon::DataFrame.new({a: [1,2,3], b: [2,3,4]})
   df.insert_column(:c){a + b}.to_json #-> {a: [1,2,3], b: [2,3,4], c: [3,5,7]}
   df.insert_column(:d, [1, 2, 3]).to_json #-> {a: [1,2,3], b: [2,3,4], c: [3,5,7], d: [1,2,3]}
   df.insert_column((df[:d]*2).name(:e)) #-> {a: [1,2,3], b: [2,3,4], c: [3,5,7], d: [1,2,3], e: [2,4,6]