Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

KeyError when converting df to_list

Trying to get one column of a df into a list, but a KeyError is thrown each time.

Writing a function to convert a dataframe to a subplot.
I want to take the first and last value in the df column containing x-axis values so that I can label the xaxis of the subplot with the first and last values only.
tolist() (or to_list) is throwing a KeyError, however.
Can anyone point out where i’m going wrong?

def df_to_subplot(df, df_field_x_axis, subplot_title, nrows, ncols):

    fig, axes = plt.subplots(nrows=nrows, ncols=ncols, sharex=True, sharey=True)
    df.set_index(df_field_x_axis, inplace=True)
    for col, ax in zip(df.columns, axes.flat):
        if col != df_field_x_axis:
            df[col].plot.line(ax=ax)
            ax.set_title(col)

    df = df.sort_values(df_field_x_axis)
    x_ticks = df[df_field_x_axis].tolist()     <<<<<------throws a KeyError
    for ax in axes.flatten():
        ticks = ax.get_xticks()
        ax.set_xticks(x_ticks[0], x_ticks[-1])
        ax.set_yticks()
        plt.setp(ax.get_xticklabels(), rotation=0)

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

The KeyError is thrown because you’re trying to access a column that doesn’t exist in the DataFrame. This is because you’ve set df_field_x_axis as the index of the DataFrame with df.set_index(df_field_x_axis, inplace=True). After this operation, df_field_x_axis is no longer a column in the DataFrame, but the index.

To fix this, you should get the index values to a list instead of trying to access it as a column. Here’s the corrected code:

def df_to_subplot(df, df_field_x_axis, subplot_title, nrows, ncols):

    fig, axes = plt.subplots(nrows=nrows, ncols=ncols, sharex=True, sharey=True)
    df.set_index(df_field_x_axis, inplace=True)
    for col, ax in zip(df.columns, axes.flat):
        if col != df_field_x_axis:
            df[col].plot.line(ax=ax)
            ax.set_title(col)

    df = df.sort_index()
    x_ticks = df.index.tolist()     # <<<<<------changed this line
    for ax in axes.flatten():
        ticks = ax.get_xticks()
        ax.set_xticks([x_ticks[0], x_ticks[-1]])  # <<<<<------changed this line
        ax.set_yticks()
        plt.setp(ax.get_xticklabels(), rotation=0)

In the line ax.set_xticks([x_ticks[0], x_ticks[-1]]), I’ve changed x_ticks[0], x_ticks[-1] to [x_ticks[0], x_ticks[-1]] because set_xticks expects a list of x locations for the ticks.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading