一张图中每个列数据框的分布概率

时间:2018-06-20 15:40:59

标签: pandas visualization seaborn

我正在通过seaborn库sns.distplot()中的distplot为数据帧的每一列创建概率分布。对于一个情节我做

x = df['A']
sns.distplot(x);

我正在尝试使用FacetGrid&Map一次为每个列提供所有图 通过这种方式。但是根本不起作用。

  g = sns.FacetGrid(df, col = 'A','B','C','D','E')
  g.map(sns.distplot())

4 个答案:

答案 0 :(得分:2)

您在两个层面上都错了。

  • Python语法。
    FacetGrid(df, col = 'A','B','C','D','E')无效,因为col被设置为A,其余字符被解释为进一步的参数。但是由于未命名,因此这是无效的python语法。

  • 原始概念。

    • Seaborn希望将单个列名作为colrow参数的输入。这意味着数据帧必须采用一种具有一列的格式,该列确定相应数据所属的列或行。

    • 您不调用地图要使用的函数。这个想法当然是map本身所称的。

解决方案:

  • 列上方的循环

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    df = pd.DataFrame(np.random.randn(14,5), columns=list("ABCDE"))
    
    fig, axes = plt.subplots(ncols=5)
    for ax, col in zip(axes, df.columns):
        sns.distplot(df[col], ax=ax)
    
    plt.show()
    
  • 融合数据框

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    df = pd.DataFrame(np.random.randn(14,5), columns=list("ABCDE"))
    
    g = sns.FacetGrid(df.melt(), col="variable")
    g.map(sns.distplot, "value")
    
    plt.show()
    

答案 1 :(得分:1)

我认为您需要使用melt将数据框重整为长格式,请参见以下MVCE:

df = pd.DataFrame(np.random.random((100,5)), columns = list('ABCDE'))
dfm = df.melt(var_name='columns')
g = sns.FacetGrid(dfm, col='columns')
g = (g.map(sns.distplot, 'value'))

输出: enter image description here

答案 2 :(得分:0)

我认为最简单的方法是只循环列并创建图。

import numpy as np
improt pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.random((100,5)), columns = list('ABCDE'))
for col in df.columns:
    hist = df[col].hist(bins=10)
    print("Plotting for column {}".format(col))
    plt.show()

答案 3 :(得分:0)

您可以使用以下内容:

# listing dataframes types
list(set(df.dtypes.tolist()))
# include only float and integer
df_num = df.select_dtypes(include = ['float64', 'int64'])
# display what has been selected
df_num.head()
# plot
df_num.hist(figsize=(16, 20), bins=50, xlabelsize=8, ylabelsize=8);