Source code for openpnm.io._pandas

import numpy as np
from pandas import DataFrame

from openpnm.io import project_to_dict
from openpnm.utils import Project, sanitize_dict


[docs] def network_to_pandas(network, join=False, delim='.'): """Converts network data to a Pandas DataFrame.""" proj = Project() proj.append(network) # Initialize pore and throat data dictionary using Dict class pdata = project_to_dict(project=proj, element='pore', flatten=True, categorize_by=[], delim=delim) tdata = project_to_dict(project=proj, element='throat', flatten=True, categorize_by=[], delim=delim) data = _to_pandas(pdata, tdata, join, Np=network.Np, Nt=network.Nt) return data
[docs] def project_to_pandas(project, join=False, delim='.'): r""" Convert the Network and Phase data to a Pandas DataFrame(s) Parameters ---------- project : list An OpenPNM ``project`` object join : bool If ``False`` (default), two DataFrames are returned with *pore* data in one, and *throat* data in the other. If ``True`` the pore and throat data are combined into a single DataFrame. This can be problematic as it will put NaNs into all the *pore* columns which are shorter than the *throat* columns. Returns ------- Pandas ``DataFrame`` object(s) containing property and label data in each column. If ``join`` was ``False`` (default) the two DataFrames are returned in a dict, otherwise a single DataFrame with pore and throat data in the same file, despite the column length being different. """ network = project.network # Initialize pore and throat data dictionary using Dict class pdata = project_to_dict(project=project, element='pore', flatten=True, categorize_by=['name'], delim=delim) tdata = project_to_dict(project=project, element='throat', flatten=True, categorize_by=['name'], delim=delim) data = _to_pandas(pdata, tdata, join, Np=network.Np, Nt=network.Nt) return data
def _to_pandas(pdata, tdata, join, Np, Nt): # Scan data and convert non-1d arrays to multiple columns for key in list(pdata.keys()): if np.shape(pdata[key]) != (Np,): arr = pdata.pop(key) tmp = np.split(arr, arr.shape[1], axis=1) cols = range(len(tmp)) pdata.update({key+'['+str(i)+']': tmp[i].squeeze() for i in cols}) for key in list(tdata.keys()): if np.shape(tdata[key]) != (Nt,): arr = tdata.pop(key) tmp = np.split(arr, arr.shape[1], axis=1) cols = range(len(tmp)) tdata.update({key+'['+str(i)+']': tmp[i].squeeze() for i in cols}) # Convert sanitized dictionaries to DataFrames pdata = DataFrame(sanitize_dict(pdata)) tdata = DataFrame(sanitize_dict(tdata)) # Prepare DataFrames to be returned if join: data = tdata.join(other=pdata, how='left') else: data = {'pore': pdata, 'throat': tdata} return data