nodes: 0, module; 1, function_definition; 2, function_name:append_row; 3, parameters; 4, block; 5, identifier:self; 6, identifier:index; 7, identifier:values; 8, default_parameter; 9, expression_statement; 10, if_statement; 11, if_statement; 12, comment:# append index value; 13, expression_statement; 14, comment:# add data values, if not in values then use None; 15, for_statement; 16, identifier:new_cols; 17, True; 18, comment:"""
          Appends a row 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 index: value of the index
          :param values: dictionary of values
          :param new_cols: if True add new columns in values, if False ignore
          :return: nothing
          """; 19, comparison_operator:index in self._index; 20, block; 21, identifier:new_cols; 22, block; 23, call; 24, pattern_list; 25, call; 26, block; 27, identifier:index; 28, attribute; 29, raise_statement; 30, for_statement; 31, attribute; 32, argument_list; 33, identifier:c; 34, identifier:col; 35, identifier:enumerate; 36, argument_list; 37, expression_statement; 38, identifier:self; 39, identifier:_index; 40, call; 41, identifier:col; 42, identifier:values; 43, block; 44, attribute; 45, identifier:append; 46, identifier:index; 47, attribute; 48, call; 49, identifier:IndexError; 50, argument_list; 51, if_statement; 52, identifier:self; 53, identifier:_index; 54, identifier:self; 55, identifier:_columns; 56, attribute; 57, argument_list; 58, string; 59, comparison_operator:col not in self._columns; 60, block; 61, subscript; 62, identifier:append; 63, call; 64, string_content:index already in DataFrame; 65, identifier:col; 66, attribute; 67, expression_statement; 68, attribute; 69, identifier:c; 70, attribute; 71, argument_list; 72, identifier:self; 73, identifier:_columns; 74, call; 75, identifier:self; 76, identifier:_data; 77, identifier:values; 78, identifier:get; 79, identifier:col; 80, None; 81, attribute; 82, argument_list; 83, identifier:self; 84, identifier:_add_column; 85, identifier:col
code: def append_row(self, index, values, new_cols=True):
          """
          Appends a row 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 index: value of the index
          :param values: dictionary of values
          :param new_cols: if True add new columns in values, if False ignore
          :return: nothing
          """
  
          if index in self._index:
              raise IndexError('index already in DataFrame')
  
          if new_cols:
              for col in values:
                  if col not in self._columns:
                      self._add_column(col)
  
          # append index value
          self._index.append(index)
  
          # add data values, if not in values then use None
          for c, col in enumerate(self._columns):
              self._data[c].append(values.get(col, None))