def get_dataframe(self, output_columns=None):
import pandas as pd<EOL>valid_labels = [a.replace('<STR_LIT:_>', '<STR_LIT:U+0020>') for a in self.__dict__<EOL>if not (a.startswith('<STR_LIT>') or a.startswith('<STR_LIT:_>'))<EOL>]<EOL>valid_labels.remove('<STR_LIT>')<EOL>valid_labels.extend(<EOL>['<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>']<EOL>)<EOL>ref_index = valid_labels.index('<STR_LIT>')<EOL>valid_labels[ref_index:ref_index + <NUM_LIT:1>] = ['<STR_LIT>' + a for a in Reference._fields]<EOL>app_index = valid_labels.index('<STR_LIT>')<EOL>valid_labels[app_index:app_index + <NUM_LIT:1>] = ['<STR_LIT>' + a for a in Apparatus._fields]<EOL>species_list = list(set(chain(*[list(d.composition.keys()) for d in self.datapoints])))<EOL>if output_columns is None or len(output_columns) == <NUM_LIT:0>:<EOL><INDENT>col_labels = valid_labels<EOL>comp_index = col_labels.index('<STR_LIT>')<EOL>col_labels[comp_index:comp_index + <NUM_LIT:1>] = species_list + ['<STR_LIT>']<EOL><DEDENT>else:<EOL><INDENT>output_columns = [a.lower() for a in output_columns]<EOL>col_labels = []<EOL>for col in output_columns:<EOL><INDENT>if col in valid_labels or col in ['<STR_LIT>', '<STR_LIT>']:<EOL><INDENT>col_labels.append(col)<EOL><DEDENT>else:<EOL><INDENT>raise ValueError('<STR_LIT>'.format(col))<EOL><DEDENT><DEDENT>if '<STR_LIT>' in col_labels:<EOL><INDENT>comp_index = col_labels.index('<STR_LIT>')<EOL>col_labels[comp_index:comp_index + <NUM_LIT:1>] = species_list + ['<STR_LIT>']<EOL><DEDENT>if '<STR_LIT>' in col_labels:<EOL><INDENT>ref_index = col_labels.index('<STR_LIT>')<EOL>col_labels[ref_index:ref_index + <NUM_LIT:1>] = ['<STR_LIT>' + a for a in Reference._fields]<EOL><DEDENT>if '<STR_LIT>' in col_labels:<EOL><INDENT>app_index = col_labels.index('<STR_LIT>')<EOL>col_labels[app_index:app_index + <NUM_LIT:1>] = ['<STR_LIT>' + a for a in Apparatus._fields]<EOL><DEDENT><DEDENT>data = []<EOL>for d in self.datapoints:<EOL><INDENT>row = []<EOL>d_species = list(d.composition.keys())<EOL>for col in col_labels:<EOL><INDENT>if col in species_list:<EOL><INDENT>if col in d_species:<EOL><INDENT>row.append(d.composition[col].amount)<EOL><DEDENT>else:<EOL><INDENT>row.append(Q_(<NUM_LIT:0.0>, '<STR_LIT>'))<EOL><DEDENT><DEDENT>elif '<STR_LIT>' in col or '<STR_LIT>' in col:<EOL><INDENT>split_col = col.split('<STR_LIT::>')<EOL>if split_col[<NUM_LIT:1>] == '<STR_LIT>':<EOL><INDENT>row.append(getattr(getattr(self, split_col[<NUM_LIT:0>]), split_col[<NUM_LIT:1>])[<NUM_LIT:0>]['<STR_LIT:name>'])<EOL><DEDENT>else:<EOL><INDENT>row.append(getattr(getattr(self, split_col[<NUM_LIT:0>]), split_col[<NUM_LIT:1>]))<EOL><DEDENT><DEDENT>elif col in ['<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>']:<EOL><INDENT>row.append(getattr(d, col.replace('<STR_LIT:U+0020>', '<STR_LIT:_>')))<EOL><DEDENT>elif col == '<STR_LIT>':<EOL><INDENT>row.append(getattr(self, col.replace('<STR_LIT:U+0020>', '<STR_LIT:_>'))[<NUM_LIT:0>]['<STR_LIT:name>'])<EOL><DEDENT>elif col == '<STR_LIT>':<EOL><INDENT>row.append(d.composition_type)<EOL><DEDENT>else:<EOL><INDENT>row.append(getattr(self, col.replace('<STR_LIT:U+0020>', '<STR_LIT:_>')))<EOL><DEDENT><DEDENT>data.append(row)<EOL><DEDENT>col_labels = [a.title() for a in col_labels]<EOL>columns = pd.Index(col_labels)<EOL>return pd.DataFrame(data=data, columns=columns)<EOL>
Get a Pandas DataFrame of the datapoints in this instance.

        Arguments:
            output_columns (`list`, optional): List of strings specifying the columns to include
                in the output DataFrame. The default is `None`, which outputs all of the
                columns. Options include (not case sensitive):

                    * ``Temperature``
                    * ``Pressure``
                    * ``Ignition Delay``
                    * ``Composition``
                    * ``Equivalence Ratio``
                    * ``Reference``
                    * ``Apparatus``
                    * ``Experiment Type``
                    * ``File Author``
                    * ``File Version``
                    * ``ChemKED Version``

                In addition, specific fields from the ``Reference`` and ``Apparatus`` attributes can
                be included by specifying the name after a colon. These options are:

                    * ``Reference:Volume``
                    * ``Reference:Journal``
                    * ``Reference:DOI``
                    * ``Reference:Authors``
                    * ``Reference:Detail``
                    * ``Reference:Year``
                    * ``Reference:Pages``
                    * ``Apparatus:Kind``
                    * ``Apparatus:Facility``
                    * ``Apparatus:Institution``

                Only the first author is printed when ``Reference`` or ``Reference:Authors`` is
                selected because the whole author list may be quite long.

        Note:
            If the Composition is selected as an output type, the composition specified in the
            `DataPoint` is used. No attempt is made to convert to a consistent basis; mole fractions
            will remain mole fractions, mass fractions will remain mass fractions, and mole percent
            will remain mole percent. Therefore, it is possible to end up with more than one type of
            composition specification in a given column. However, if the composition is included
            in the resulting dataframe, the type of each composition will be specified by the "Kind"
            field in each row.

        Examples:
            >>> df = ChemKED(yaml_file).get_dataframe()
            >>> df = ChemKED(yaml_file).get_dataframe(['Temperature', 'Ignition Delay'])

        Returns:
            `~pandas.DataFrame`: Contains the information regarding each point in the ``datapoints``
                attribute