pivoting pandas dataframe into prefixed cols, not a MultiIndex

Ben Mabey

I have a timeseries dataframe that is similar to:

ts = pd.DataFrame([['Jan 2000','WidgetCo',0.5, 2], ['Jan 2000','GadgetCo',0.3, 3], ['Jan 2000','SnazzyCo',0.2, 4],
          ['Feb 2000','WidgetCo',0.4, 2], ['Feb 2000','GadgetCo',0.5, 2.5], ['Feb 2000','SnazzyCo',0.1, 4],
          ], columns=['month','company','share','price'])

Which looks like:

  month   company  share  price
0  Jan 2000  WidgetCo    0.5    2.0
1  Jan 2000  GadgetCo    0.3    3.0
2  Jan 2000  SnazzyCo    0.2    4.0
3  Feb 2000  WidgetCo    0.4    2.0
4  Feb 2000  GadgetCo    0.5    2.5
5  Feb 2000  SnazzyCo    0.1    4.0

I can pivot this table like so:

pd.pivot_table(ts,index='month', columns='company')

Which gets me:

            share                      price                  
company  GadgetCo SnazzyCo WidgetCo GadgetCo SnazzyCo WidgetCo
month                                                         
Feb 2000      0.5      0.1      0.4      2.5        4        2
Jan 2000      0.3      0.2      0.5      3.0        4        2

This is what I want except that I need to collapse the MultiIndex so that the company is used as a prefix for share and price like so:

          WidgetCo_share  WidgetCo_price  GadgetCo_share  GadgetCo_price   ...
month                                                                      
Jan 2000             0.5               2             0.3             3.0   
Feb 2000             0.4               2             0.5             2.5   

I came up with this function to do just that but it seems like a poor solution:

def pivot_table_to_flat(df, column, index):
    res = df.set_index(index)
    cols = res.drop(column, axis=1).columns.values
    resulting_cols = []
    for prefix in res[column].unique():
        for col in cols:
            new_col_name = prefix + '_' + col
            res[new_col_name] = res[res[column] == prefix][col]
            resulting_cols.append(new_col_name)

    return res[resulting_cols]

pivot_table_to_flat(ts, index='month', column='company')

What is a better way of accomplishing a pivot resulting in a columns with prefixes as opposed to a MultiIndex?

Ben Mabey

I figured it out. Using the data on the MultiIndex makes for a pretty clean solution:

def flatten_multi_index(df):
    mi = df.columns
    suffixes, prefixes = mi.levels
    col_names = [prefixes[i_p] + '_' + suffixes[i_s] for (i_s, i_p) in zip(*mi.labels)]
    df.columns = col_names
    return df

flatten_multi_index(pd.pivot_table(ts,index='month', columns='company'))

The above version only handles a 2D MultiIndex but it could be generalized if needed.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Pandas dataframe pivoting

From Dev

Pivoting Dataframe with Pandas

From Java

Pivoting pandas dataframe by rank on id

From Dev

Pandas Dataframe Stacking versus Pivoting

From Dev

Resampling, grouping, pivoting a pandas dataframe

From Dev

concatinate pandas dataframe to multiindex

From Dev

reindex multiindex pandas dataframe

From Java

Pandas Dataframe Multiindex Merge

From Dev

Pandas multiIndex DataFrame sort

From Dev

pandas indexing in multiindex dataframe

From Dev

Merge pandas DataFrame with MultiIndex

From Dev

Building MultiIndex in Pandas DataFrame

From Dev

MultiIndex Pandas From Dataframe

From Dev

Pandas MultiIndex DataFrame Sorting

From Dev

Pandas Dataframe Multiindex Merge

From Dev

Indexing with multiindex dataframe in pandas

From Dev

Resampling a pandas MultiIndex dataframe

From Dev

Update a Pandas MultiIndex DataFrame

From Dev

Pivoting a pandas dataframe with duplicate index values

From Dev

Pivoting a Pandas dataframe with a gapless daterange as index

From Dev

Pivoting a pandas dataframe to generate a (seaborn) heatmap

From Dev

How to efficiently columnize (=pivoting) pandas DataFrame (with groupby)?

From Dev

Plotting 3 cols of pandas dataframe as heatmap

From Dev

Make multiindex columns in a pandas dataframe

From Java

Pandas: Collapse rows in a Multiindex dataframe

From Java

Select rows in pandas MultiIndex DataFrame

From Dev

grouping and summing multiindex dataframe in pandas

From Dev

concat MultiIndex pandas DataFrame columns

From Dev

Pandas: bar plot with multiIndex dataframe