【问题标题】:Group boxplot from Pandas data frame where one column is with float data and the other column is with categorical dataPandas 数据框中的分组箱线图,其中一列包含浮点数据,另一列包含分类数据
【发布时间】:2020-07-02 08:10:04
【问题描述】:

此时我有一个名为 mergeDf(40 行 x 2 列) 的 pandas Dataframe,列类型为浮点型和分类型 - 见下文。

NH01        float64
NH01cat    category
dtype: object

我正在尝试在 seaborn 中构建一个并排的箱线图,它将在 y 轴上包含 NH01 列中的所有值,并且它们应该根据它们在 NH01cat 列中的值进行分类。我的最终数据框将包括42 列,其中每两个相邻列将是定量和分类数据,如示例所示(例如 NH01 - float、NH01- categorical、NH02 -float、NH02cat- categorical 等)。最终图应包含 21 对基于 2 个相邻列的每个数据集的箱线图)

      NH01    NH01cat
0   0.428581    NacZ
1   0.425339    NacZ
2   0.428772    NacZ
3   0.425148    NacZ
4   0.428581    NacZ
5   0.433540    NacZ
6   0.422096    NacX
7   0.423431    NacX
8   0.432205    NacX
9   0.431824    NacX
10  0.424194    NacX`

我正在尝试下面的代码行:

ax=sns.boxplot(y=mergeDf['NH01'], hue="NH01cat",orient='v', data=mergeDf, linewidth=2.5)

但我得到的结果是一个箱线图。

如何根据可用数据对箱线图进行分组?

谢谢

【问题讨论】:

    标签: python pandas seaborn boxplot


    【解决方案1】:

    hue= 只能在您已经拥有不同级别的x 时使用。

    尝试:

    ax=sns.boxplot(y='NH01', x="NH01cat",orient='v', data=mergeDf, linewidth=2.5)
    

    【讨论】:

    • 谢谢,但我希望它们并排而不是分开。我想添加更多的列集,所以每个未来的列集将有一列定量数据和一列分类数据。所以最后如果最终数据框由 10 列组成,它应该有 5 个并排的箱线图。
    • 我按照措辞回答了您的问题。如果您真的想问一个不同的问题,那么您可以编辑您的问题并提供足够的信息以获得相关答案。
    • 是的,我承认我不够清楚并编辑了最初的问题。谢谢
    【解决方案2】:

    如果我现在正确理解了您的问题,那么您的数据框如下所示:

    N = 100
    M = 5
    df = pd.DataFrame()
    for i in range(1,M+1):
        df[f'NH{i:02d}'] = np.random.normal(loc=i, size=(N,))
        df[f'NH{i:02d}cat'] = np.random.choice(['NacZ','NacX'], size=(N,))
    print(df.head())
    

    输出:

           NH01 NH01cat      NH02 NH02cat      NH03 NH03cat      NH04 NH04cat  \
    0  0.231058    NacZ  1.872279    NacZ  4.048766    NacX  3.869479    NacZ   
    1  0.062530    NacX  1.210339    NacZ  3.374466    NacZ  2.827855    NacX   
    2  1.146168    NacX  0.752690    NacZ  3.948877    NacZ  4.320780    NacZ   
    3  0.266700    NacZ  0.874896    NacX  1.529101    NacX  3.448940    NacZ   
    4  1.620292    NacX  0.689638    NacX  2.778528    NacX  4.590301    NacZ   
    
           NH05 NH05cat  
    0  3.757337    NacX  
    1  4.552330    NacZ  
    2  5.188367    NacX  
    3  5.067367    NacZ  
    4  4.108142    NacZ  
    

    您想用色调嵌套箱线图绘制。

    为此,您必须将数据从“宽”转换为“长”。可能有更有效的方法来做到这一点(可能是熊猫专家的一个单独问题),但您可以使用pd.wide_to_long(),只要您稍微更改列名:

    import re
    df2 = df.copy()
    df2.columns = [re.sub('NH([0-9]{2})cat','cat-NH\\1',c) for c in df2.columns]
    df2.columns = [re.sub('^NH([0-9]{2})$','val-NH\\1',c) for c in df2.columns]
    df2['id'] = df.index
    df2 = pd.wide_to_long(df2, ['val','cat'], j='NH', i='id', sep='-', suffix='NH\\d+')
    df2 = df2.reset_index()
    

    现在 df2 看起来像这样:

       id    NH       val   cat
    0   0  NH01  0.231058  NacZ
    1   1  NH01  0.062530  NacX
    2   2  NH01  1.146168  NacX
    3   3  NH01  0.266700  NacZ
    4   4  NH01  1.620292  NacX
    

    你可以绘制:

    sns.boxplot(y="val",x="NH",hue='cat', data=df2)
    

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2019-07-25
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多