From 13b3632c311d90bd141d504cfc7c5068022ad53c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 8 Sep 2015 00:13:23 -0400 Subject: [PATCH] Fixed Pandas MultiIndex for refactored Filter.get_pandas_dataframe(...) routine --- openmc/cross.py | 8 +++++--- openmc/filter.py | 11 +++++------ openmc/tallies.py | 23 ++++++++++++++++++++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 05ca0f9b6c..51b579553a 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -352,9 +352,11 @@ class CrossFilter(object): df = self.left_filter.get_pandas_dataframe(datasize, summary) # If left and right filters are different, combine their bins else: - df = '(' + self.left_filter.get_pandas_dataframe(datasize, summary) - df += ' ' + self.binary_op + ' ' - df += self.right_filter.get_pandas_dataframe(datasize, summary) + ')' + left_df = self.left_filter.get_pandas_dataframe(datasize, summary) + right_df = self.right_filter.get_pandas_dataframe(datasize, summary) + left_df = left_df.astype(str) + right_df = right_df.astype(str) + df = '(' + left_df + ' ' + self.binary_op + ' ' + right_df + ')' return df diff --git a/openmc/filter.py b/openmc/filter.py index c24684039c..35cbd1dc50 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -566,11 +566,11 @@ class Filter(object): level_bins = np.tile(level_bins, tile_factor) level_dict[level_key] = level_bins - # Initialize a Pandas DataFrame from the level dictionary - if level_df is None: - level_df = pd.DataFrame(level_dict) - else: - level_df = pd.concat([level_df, pd.DataFrame(level_dict)], axis=1) + # Initialize a Pandas DataFrame from the level dictionary + if level_df is None: + level_df = pd.DataFrame(level_dict) + else: + level_df = pd.concat([level_df, pd.DataFrame(level_dict)], axis=1) # Create DataFrame column for distribcell instances IDs # NOTE: This is performed regardless of whether the user @@ -613,7 +613,6 @@ class Filter(object): filter_bins = filter_bins df = pd.concat([df, pd.DataFrame({self.type :filter_bins})]) - df = df.astype(np.str) return df def __repr__(self): diff --git a/openmc/tallies.py b/openmc/tallies.py index 57fa911b21..9d5f4dc008 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1076,8 +1076,29 @@ class Tally(object): df['mean'] = self.mean.ravel() df['std. dev.'] = self.std_dev.ravel() - df.index.name = 'bin' df = df.dropna(axis=1) + + # Expand the columns into Pandas MultiIndices for readability + if pd.__version__ >= '0.16': + columns = copy.deepcopy(df.columns.values) + + # Convert all elements in columns list to tuples + for i, column in enumerate(columns): + if not isinstance(column, tuple): + columns[i] = (column,) + + # Make each tuple the same length + max_len_column = len(max(columns, key=len)) + for i, column in enumerate(columns): + delta_len = max_len_column - len(column) + if delta_len > 0: + new_column = list(column) + new_column.extend(['']*delta_len) + columns[i] = tuple(new_column) + + # Create and set a MultiIndex for the DataFrame's columns + df.columns = pd.MultiIndex.from_tuples(columns) + return df def export_results(self, filename='tally-results', directory='.',