Module music_df.humdrum_export.df_utils.split_df_by_pitch

Functions

def split_df_by_pitch(df: pandas.DataFrame, split_points: Sequence[int] | int) ‑> Tuple[pandas.DataFrame, ...]
Expand source code
def split_df_by_pitch(
    df: pd.DataFrame, split_points: t.Union[t.Sequence[int], int]
) -> t.Tuple[pd.DataFrame, ...]:
    """
    Split point is included in upper df.
    >>> df = pd.DataFrame(
    ...     {
    ...         "pitch": [0, 32, 57, 65, 91],
    ...         "onset": [0, 0, 1, 1, 2],
    ...         "release": [0, 1, 2, 2, 3],
    ...         "type": ["bar"] + ["note"] * 4,
    ...     }
    ... )
    >>> df
       pitch  onset  release  type
    0      0      0        0   bar
    1     32      0        1  note
    2     57      1        2  note
    3     65      1        2  note
    4     91      2        3  note
    >>> df1, df2 = split_df_by_pitch(df, 65)
    >>> df1
       pitch  onset  release  type
    0      0      0        0   bar
    1     32      0        1  note
    2     57      1        2  note
    >>> df2
       pitch  onset  release  type
    0      0      0        0   bar
    1     65      1        2  note
    2     91      2        3  note
    >>> df1, df2, df3 = split_df_by_pitch(df, (60, 65))
    >>> df1
       pitch  onset  release  type
    0      0      0        0   bar
    1     32      0        1  note
    2     57      1        2  note
    >>> df2
       pitch  onset  release type
    0      0      0        0  bar
    >>> df3
       pitch  onset  release  type
    0      0      0        0   bar
    1     65      1        2  note
    2     91      2        3  note
    >>> df1, df2, df3 = split_df_by_pitch(df, (50, 65))
    >>> df1
       pitch  onset  release  type
    0      0      0        0   bar
    1     32      0        1  note
    >>> df2
       pitch  onset  release  type
    0      0      0        0   bar
    1     57      1        2  note
    >>> df3
       pitch  onset  release  type
    0      0      0        0   bar
    1     65      1        2  note
    2     91      2        3  note
    """
    if not split_points:
        return (df,)
    note_mask = df.type == "note"
    note_df = df[note_mask]
    nonnote_df = df[~note_mask]
    out = []
    if isinstance(split_points, int):
        split_points = [split_points]
    for low, hi in zip(
        [float("-inf")] + list(split_points),
        list(split_points) + [float("inf")],
    ):
        out.append(
            _merge_nonnotes(
                note_df[note_df.pitch.between(low, hi, inclusive="left")],
                nonnote_df,
            )
        )
    return tuple(out)

Split point is included in upper df.

>>> df = pd.DataFrame(
...     {
...         "pitch": [0, 32, 57, 65, 91],
...         "onset": [0, 0, 1, 1, 2],
...         "release": [0, 1, 2, 2, 3],
...         "type": ["bar"] + ["note"] * 4,
...     }
... )
>>> df
   pitch  onset  release  type
0      0      0        0   bar
1     32      0        1  note
2     57      1        2  note
3     65      1        2  note
4     91      2        3  note
>>> df1, df2 = split_df_by_pitch(df, 65)
>>> df1
   pitch  onset  release  type
0      0      0        0   bar
1     32      0        1  note
2     57      1        2  note
>>> df2
   pitch  onset  release  type
0      0      0        0   bar
1     65      1        2  note
2     91      2        3  note
>>> df1, df2, df3 = split_df_by_pitch(df, (60, 65))
>>> df1
   pitch  onset  release  type
0      0      0        0   bar
1     32      0        1  note
2     57      1        2  note
>>> df2
   pitch  onset  release type
0      0      0        0  bar
>>> df3
   pitch  onset  release  type
0      0      0        0   bar
1     65      1        2  note
2     91      2        3  note
>>> df1, df2, df3 = split_df_by_pitch(df, (50, 65))
>>> df1
   pitch  onset  release  type
0      0      0        0   bar
1     32      0        1  note
>>> df2
   pitch  onset  release  type
0      0      0        0   bar
1     57      1        2  note
>>> df3
   pitch  onset  release  type
0      0      0        0   bar
1     65      1        2  note
2     91      2        3  note