【问题标题】:How to group-by twice, preserve original columns, and plot如何分组两次,保留原始列并绘制
【发布时间】:2021-05-21 12:46:45
【问题描述】:

我有以下数据集(仅显示示例):

我想找到每个区域最有影响力的运动,然后通过 Seaborn barplot 绘制它。 我使用以下代码来执行此操作。

# Create Dataset Using Only Area, Exercise and Impact Level Chategories
    CA_data = Data[['area', 'exercise', 'impact level']]

    # Compute Mean Impact Level per Exercise per Area
    mean_il_CA = CA_data.groupby(['area', 'exercise'])['impact level'].mean().reset_index()

    mean_il_CA_hello = mean_il_CA.groupby('area')['impact level'].max().reset_index()

    # Plot
    cx = sns.barplot(x="impact level", y="area", data=mean_il_CA_hello)
    plt.title('Most Impactful Exercises Considering Area')
    plt.show()

生成的数据集是:

这意味着当我绘图时,在 y 轴上只显示相对于区域的标签,而不是像我想要的那样“区域标签”+“运动标签”。

如何将 'exercise 列重新插入到我的最终数据集中? 如何在 y 图上同时获取区域名称和练习?

【问题讨论】:

    标签: python-3.x group-by seaborn bar-chart


    【解决方案1】:

    在按'area'的最大值分组时丢失'exercise'值的问题可以通过保持MultiIndex(即不使用reset_index)并使用.transform创建布尔掩码来选择适当的完整行 mean_il_CA 包含每个“区域”的最大“影响级别”值。此解决方案基于this answer by unutbu 中提供的代码。条形图的完整标签可以通过连接“区域”和“锻炼”的标签来创建。

    这是一个使用 seaborn 包中的 Titanic 数据集的示例。变量“class”、“embark_town”和“fare”用于代替“area”、“exercise”和“impact_level”。分类变量都包含三个唯一值:“First”、“Second”、“Third”和“Cherbourg”、“Queenstown”、“Southampton”。

    import pandas as pd    # v 1.2.5
    import seaborn as sns  # v 0.11.1
    
    df = sns.load_dataset('titanic')
    data = df[['class', 'embark_town', 'fare']]
    data.head()
    

    data_mean = data.groupby(['class', 'embark_town'])['fare'].mean()
    data_mean
    

    # Select max values in each class and create concatenated labels
    mask_max = data_mean.groupby(level=0).transform(lambda x: x == x.max())
    data_mean_max = data_mean[mask_max].reset_index()
    data_mean_max['class, embark_town'] = data_mean_max['class'].astype(str) + ', ' \
                                          + data_mean_max['embark_town']
    data_mean_max
    

    # Draw seaborn bar chart
    sns.barplot(data=data_mean_max,
                x=data_mean_max['fare'],
                y=data_mean_max['class, embark_town'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多