【问题标题】:how to find mean for mixed categorical variables in pandas dataframe?如何在熊猫数据框中找到混合分类变量的均值?
【发布时间】:2019-07-22 23:51:27
【问题描述】:

我有关于不同年龄人群使用各种社交媒体平台的调查数据集。我想计算使用社交媒体应用程序的平均人数。以下是示例数据的样子:

这里是可重现的 pandas 数据框:

df=pd.DataFrame({'age': np.random.randint(10,100,size=10),
                'web1a': np.random.choice([1, 2], size=(10,)),
                'web1b': np.random.choice([1, 2], size=(10,), p=[1./3, 2./3]),
                'web1c': np.random.choice([1, 2], size=(10,)),
                'web1d': np.random.choice([1, 2], size=(10,))})

这是我尝试过的:

df.pivot_table(df, values='web1a', index='age', aggfunc='mean')

但它效率不高,也没有产生我想要的输出。有什么想法可以完成吗?谢谢

更新

对我来说,这样做的方法是,首先在每一列中选择分类值并获取它的平均值,这对其他人来说可能是相同的。如果我这样做,我怎样才能很好地绘制它们?

请注意,web1aweb1bweb1cweb1d1 表示用户,2 表示非用户。我想计算用户和非用户的平均年龄。我怎样才能做到这一点?有人给我一个可能的想法来实现这一点吗?谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用

    df.melt('age').set_index(['variable','value']).mean(level=[0,1]).unstack().plot(kind='bar')
    

    【讨论】:

    • 这太棒了,如何修改图例、标题?
    • @beyond_inifinity 希望链接可以帮助stackoverflow.com/questions/33149428/…
    • @beyond_inifinity 链接是否足够清晰?或者你想怎么称呼他们
    • 为什么会生成默认标题?我该如何重命名它?我还想将蓝色条形图标记为用户,将橙色条形图标记为非用户,我该怎么做?我会接受这个很棒的解决方案,谢谢!
    • @beyond_inifinity 试试df.melt('age').set_index(['variable','value']).age.mean(level=[0,1]).unstack().rename(columns={1:'user',2:'none-user'}).plot(kind='bar')
    【解决方案2】:

    您可以按“web*”列分组并计算“年龄”列的平均值。

    您还可以绘制条形图(颜色可以在子图中定义)。我不确定饼图在这种情况下是否有意义。

    我尝试使用您的data,只使用以“web”开头的列。有比 '1' 和 '2' 更多的值,所以我假设您只想分析用户和非用户,而不是别的。你可以用同样的方法在图表中更改值或添加其他值,只要你知道你要绘制什么值即可。

    df = df.filter(regex=('web|age'),axis=1)
    
    userNr = '1'
    nonUserNr = '2'
    users = list()
    nonUsers = list()
    labels = [x for x in df.columns.tolist() if 'web' in x]
    for col in labels:
        users.append(df.loc[:,['age',col]].groupby(col).mean().loc[userNr][0])
        nonUsers.append(df.loc[:,['age',col]].groupby(col).mean().loc[nonUserNr][0])
    
    from matplotlib import pyplot as plt
    x = np.arange(1, len(labels)+1)
    ax = plt.subplot(111)
    ax.bar(x-0.1, users, width=0.2,color='g')
    ax.bar(x+0.1,nonUsers, width=0.2,color='r')
    plt.xticks(x, labels)
    plt.legend(['users','non-users'])
    plt.show()
    

    【讨论】:

      【解决方案3】:

      这可以使用groupby 方法来完成:

      df.groupby(['web1a', 'web1b', 'web1c', 'web1d']).mean()
      

      【讨论】:

      • 如何使用条形图或饼图绘制它们?这段代码的输出似乎有点令人困惑,我为他们绘制了图?
      • df.groupby(['web1a', 'web1b', 'web1c', 'web1d']).mean().reset_index().plot.bar(y='age') 但是您需要手动调整 x 轴标签。
      【解决方案4】:
      df.melt(id_vars='age').groupby(['variable', 'value']).mean()
      

      【讨论】:

      • 是否可以为您的输入代码制作饼图或饼图?谢谢
      • 切片大小与年龄成正比的饼图没有任何意义。通过添加.plot.bar() 来使用条形图
      • 如果使用条形图,如何为web1a中的每个子组分配不同的颜色?有没有什么优雅的方法可以更好地为每个组创建子图?
      • 改为添加:.unstack().plot.bar()
      猜你喜欢
      • 2021-03-10
      • 2016-03-03
      • 2023-03-31
      • 2019-05-20
      • 2018-02-01
      • 2019-10-14
      • 2018-05-15
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多