def parse_ijk(path, columns, include_frame=False): """ Generic parser for pos, for, and vel files. Args: path (str): File path columns (list): Header include_frame (bool): Include the frame index (default: false) Returns: df (:pandas:`~pandas.DataFrame`): Atom-like dataframe """ fcol = columns[0] lcol = columns[-1] df = pd.read_csv(path, delim_whitespace=True, names=columns) step = df[df[lcol].isnull()] starts = step.drop_duplicates(fcol, keep='last').index.values + 1 nframes = len(step) nat = np.min(starts[1:] - starts[:-1]) - 1 frame, label, indices = starts_count(starts, nat) frame = pd.Series(frame, dtype='category') df = df[df.index.isin(indices)].reset_index(drop=True) if include_frame: df['frame'] = frame return df
def parse_cel(path): """ Parse cell dimensions. """ df = pd.read_csv(path, delim_whitespace=True, names=('i', 'j', 'k')) starts = df[::4].drop_duplicates(df.columns[0], keep='last').index.values + 1 frame, label, indices = starts_count(starts, 3) df = df[df.index.isin(indices)].reset_index(drop=True) df['frame'] = pd.Series(frame, dtype='category') df['label'] = pd.Series(label, dtype='category') df = df.pivot('frame', 'label') df.columns = ['xi', 'xj', 'xk', 'yi', 'yj', 'yk', 'zi', 'zj', 'zk'] df['ox'] = 0.0 df['oy'] = 0.0 df['oz'] = 0.0 df.index.names = [None] return df