代码之家  ›  专栏  ›  技术社区  ›  Georg Heiler

多个组的数据透视表

  •  0
  • Georg Heiler  · 技术社区  · 7 年前

    %pylab inline
    
    import seaborn as sns
    sns.set(color_codes=True)
    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame({"user_id": [1, 2, 3, 4, 5,
                              6, 7, 8, 9],
        "is_sick": [0, 0, 0, 0, 0,
                              0, 1, 1, 1],
                        "sex": ["male", "female", "male", "female", "female",
                              "male", "male", "female", "female"],
                        "age_group": ["young", "old", "old", "young",
                              "small", "old", "young", "young",
                              "old"],
                        "metric_1": [1, 2, 2, 3, 3, 4, 5, 6, 7]})
    df['date'] = '2019-01-01'
    df['qcut_metric_1'] = pd.qcut(df.metric_1, [0, .25, .5, .66, .75, .97, 1])
    
    # make some more data
    df_2 = df.copy()
    df_2['date'] = '2019-02-01'
    df = pd.concat([df, df_2])
    

    [(sex), (age_group), (sex, age_group)]

    注意,我知道 sex 可能类似于:

    df['sick_percentage__sex'] = df.groupby(['sex']).is_sick.transform(pd.Series.mean)
    

    一个简单的表可能看起来像:

    pd.pivot_table(df, values='sick_percentage__sex', index=['qcut_metric_1', 'sex'], columns=[], aggfunc=np.mean)
    

    看起来像:

            sick_percentage__sex
    qcut_metric_1   sex 
    (0.999, 2.0]    female  0.40
    male    0.25
    (2.0, 3.0]  female  0.40
    (3.0, 4.28] male    0.25
    (4.28, 5.0] male    0.25
    (5.0, 6.76] female  0.40
    (6.76, 7.0] female  0.40
    

    但是这不适合显示为binned metric( qcut_metric_1 )以及 同伙( [(性别),(年龄组),(性别,年龄组)]

    所需输出格式:

    qcut_metric_1, cohort, percentage_of_sickness
    

    np.mean

    agg = df.groupby(['sex']).agg({'user_id':pd.Series.nunique, 'is_sick':pd.Series.mean})
    agg.columns = ['unique_users', 'sick_percentage__sex']
    df = df.merge(agg, on='sex')
    

    现在为数据透视表的输入提供数据帧。

    但现在我也在与加权平均法的语法作斗争:

    def wavg(x):
        print(x)
        return np.average(x['sick_percentage__sex'], weights= x['unique_users'])
    

    作为数据透视表 pd.pivot表(df,值=['sick\u percentage\u sex','unique\u users',索引=['qcut\u metric\u 1','sex',列=[],aggfunc=wavg) 只将单个序列(而不是两个序列(值+权重))传递给函数。

    0 回复  |  直到 7 年前
        1
  •  0
  •   Georg Heiler    7 年前

    也许透视表不是解决问题的正确方法。

    有没有可能找到更有效的解决办法? 我的输入文件是120G,用于未压缩的CSV/当通过gzip压缩时,3GB的剩余空间将转换为熊猫大约35GB的内存需求。

    %pylab inline
    
    import seaborn as sns
    sns.set(color_codes=True)
    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame({"user_id": [1, 2, 3, 4, 5,
                              6, 7, 8, 9],
        "is_sick": [0, 0, 0, 0, 0,
                              0, 1, 1, 1],
                        "sex": ["male", "female", "male", "female", "female",
                              "male", "male", "female", "female"],
                        "age_group": ["young", "old", "old", "young",
                              "small", "old", "young", "young",
                              "old"],
                        "metric_1": [1, 2, 2, 3, 3, 4, 5, 6, 7]})
    df['date'] = '2019-01-01'
    df['qcut_metric_1'] = pd.qcut(df.metric_1, [0, .25, .5, .66, .75, .97, 1])
    
    # make some more data
    df_2 = df.copy()
    df_2['date'] = '2019-02-01'
    df = pd.concat([df, df_2])
    cohorts = [['sex', 'age_group'], ['sex'], ['age_group']]
    for cohort in cohorts:
        cohort_name = '_'.join(cohort)
        # print(cohort_name)
        agg = df.groupby(cohort).agg({'user_id':pd.Series.nunique, 'is_sick':pd.Series.mean})
        sick_percentage_column = f'sick_percentage__{cohort_name}'
        agg.columns = ['unique_users', sick_percentage_column]
        merged = df.merge(agg, on=cohort) # INNER (default) JOIN ok, as agg derived from total => no values lost
    
        groupings = ['qcut_metric_1']
        groupings.extend(cohort)
        result = merged.groupby(groupings).apply(lambda x: np.average(x[sick_percentage_column], weights= x['unique_users'])).reset_index().rename({0:sick_percentage_column}, axis=1)
        display(result)    
    
    推荐文章