def generate_family_characteristics(df, family_id, group_ids):
    """
    Given either an HMIS or a Connecting Point dataframe, add columns regarding family structure.

    :param df: HMIS or Connecting point dataframe.
    :type hmis: Pandas.Dataframe.

    :param family_id: column name of family identifier.
    :type family_id: str.

    :param group_ids: grouping column names.
    :type group_ids: [str].
    """
    df['With Child?'] = df.groupby(group_ids)['Child?'].transform(any)
    df['With Adult?'] = df.groupby(group_ids)['Adult?'].transform(any)
    df['With Family?'] = df['With Child?'] & df['With Adult?']
    df['Family?'] = df.groupby(family_id)['With Family?'].transform(any)
    return df