nodes: 0, module; 1, function_definition; 2, function_name:append_rows; 3, parameters; 4, block; 5, identifier:self; 6, identifier:indexes; 7, identifier:values; 8, default_parameter; 9, expression_statement; 10, comment:# check that the values data is less than or equal to the length of the indexes; 11, for_statement; 12, comment:# check the indexes are not duplicates; 13, expression_statement; 14, if_statement; 15, if_statement; 16, comment:# append index value; 17, expression_statement; 18, comment:# add data values, if not in values then use None; 19, for_statement; 20, expression_statement; 21, identifier:new_cols; 22, True; 23, comment:"""
          Appends rows of values to the end of the data. If there are new columns in the values and new_cols is True
          they will be added. Be very careful with this function as for sort DataFrames it will not enforce sort order. 
          Use this only for speed when needed, be careful.
  
          :param indexes: list of indexes
          :param values: dictionary of values where the key is the column name and the value is a list
          :param new_cols: if True add new columns in values, if False ignore
          :return: nothing
          """; 24, identifier:column; 25, identifier:values; 26, block; 27, assignment; 28, comparison_operator:len(set(combined_index)) != len(combined_index); 29, block; 30, identifier:new_cols; 31, block; 32, call; 33, pattern_list; 34, call; 35, block; 36, call; 37, if_statement; 38, identifier:combined_index; 39, binary_operator:self._index + indexes; 40, call; 41, call; 42, raise_statement; 43, for_statement; 44, attribute; 45, argument_list; 46, identifier:c; 47, identifier:col; 48, identifier:enumerate; 49, argument_list; 50, expression_statement; 51, attribute; 52, argument_list; 53, comparison_operator:len(values[column]) > len(indexes); 54, block; 55, attribute; 56, identifier:indexes; 57, identifier:len; 58, argument_list; 59, identifier:len; 60, argument_list; 61, call; 62, identifier:col; 63, identifier:values; 64, block; 65, attribute; 66, identifier:extend; 67, identifier:indexes; 68, attribute; 69, call; 70, identifier:self; 71, identifier:_pad_data; 72, call; 73, call; 74, raise_statement; 75, identifier:self; 76, identifier:_index; 77, call; 78, identifier:combined_index; 79, identifier:IndexError; 80, argument_list; 81, if_statement; 82, identifier:self; 83, identifier:_index; 84, identifier:self; 85, identifier:_columns; 86, attribute; 87, argument_list; 88, identifier:len; 89, argument_list; 90, identifier:len; 91, argument_list; 92, call; 93, identifier:set; 94, argument_list; 95, string; 96, comparison_operator:col not in self._columns; 97, block; 98, subscript; 99, identifier:extend; 100, call; 101, subscript; 102, identifier:indexes; 103, identifier:ValueError; 104, argument_list; 105, identifier:combined_index; 106, string_content:duplicate indexes in DataFrames; 107, identifier:col; 108, attribute; 109, expression_statement; 110, attribute; 111, identifier:c; 112, attribute; 113, argument_list; 114, identifier:values; 115, identifier:column; 116, binary_operator:'length of %s column in values is longer than indexes' % column; 117, identifier:self; 118, identifier:_columns; 119, call; 120, identifier:self; 121, identifier:_data; 122, identifier:values; 123, identifier:get; 124, identifier:col; 125, binary_operator:[None] * len(indexes); 126, string; 127, identifier:column; 128, attribute; 129, argument_list; 130, list; 131, call; 132, string_content:length of %s column in values is longer than indexes; 133, identifier:self; 134, identifier:_add_column; 135, identifier:col; 136, None; 137, identifier:len; 138, argument_list; 139, identifier:indexes
code: def append_rows(self, indexes, values, new_cols=True):
          """
          Appends rows of values to the end of the data. If there are new columns in the values and new_cols is True
          they will be added. Be very careful with this function as for sort DataFrames it will not enforce sort order. 
          Use this only for speed when needed, be careful.
  
          :param indexes: list of indexes
          :param values: dictionary of values where the key is the column name and the value is a list
          :param new_cols: if True add new columns in values, if False ignore
          :return: nothing
          """
  
          # check that the values data is less than or equal to the length of the indexes
          for column in values:
              if len(values[column]) > len(indexes):
                  raise ValueError('length of %s column in values is longer than indexes' % column)
  
          # check the indexes are not duplicates
          combined_index = self._index + indexes
          if len(set(combined_index)) != len(combined_index):
              raise IndexError('duplicate indexes in DataFrames')
  
          if new_cols:
              for col in values:
                  if col not in self._columns:
                      self._add_column(col)
  
          # append index value
          self._index.extend(indexes)
  
          # add data values, if not in values then use None
          for c, col in enumerate(self._columns):
              self._data[c].extend(values.get(col, [None] * len(indexes)))
          self._pad_data()