【问题标题】:How to separate a dataframe column by intervals, and plot如何按间隔分隔数据框列并绘制
【发布时间】:2021-01-19 17:48:22
【问题描述】:

我有一个如下所示的数据框:

     Edades
0        -15.612896
1        -18.612896
2         11.387104
3        -12.612896
4         17.387104
            ...
566597    15.387104
566598     5.387104
566599     6.387104
566600     0.387104
566601    22.387104

我想制作一个条形图,显示按标准差的倍数定义的区间分类的数据频率。到目前为止,我知道plt.hist() 实际上可以做类似的事情,但它不会让我在范围上使用浮点类型值。

我试过的代码如下:

plt.figure("Edad_Distrib")
plt.hist(nuevo_edad, range(-100,100))
plt.xlabel("Edades")
plt.ylabel("Frecuencia")
plt.title("Distrib edades")
plt.show()

我怎样才能在一个看起来像这样的范围内绘制一些东西?

plt.hist(nuevo_edad, range(-2*stdev,2*stdev))

如果它有任何用途,我有我的教授在 R 中所做的这段代码,它与随机生成的数据帧完全一样,我只是不知道如何在 python 和我的特定数据帧中实现它。

A <- rnorm(100)
m <- mean(A)
s <- var(A)
k <- -11

x = seq(-5, 5, length = k)
y = vector("numeric", length = (k-1))

for (i in 1:(k-1)){
       y[i] = sum(A>x[i] & A<x[i+1])

}

barplot(y)

【问题讨论】:

    标签: python matplotlib bar-chart histogram


    【解决方案1】:
    • 使用df.a.mean() ± df.a.std() * value 定义bin 边缘
      • 以下代码中的列表理解创建了一个 bin 边缘列表。
    • 使用pandas.Series.mean 获取数据帧的平均值
    • pandas.Series.std获取均值的标准差
    import pandas as pd
    import numpy as np  # for sample data
    import matplotlib.pyplot as plt
    
    # create sample dataframe
    np.random.seed(365)
    data = {'a': [np.random.randint(700) for _ in range(3000)]}
    df = pd.DataFrame(data)
    
    # create the bin edges
    bins = [df.a.mean() + (df.a.std() * v) for v in range(-5, 6, 1)]
    
    print(bins)
    [-652.44, -451.49, -250.55, -49.6, 151.35, 352.3, 553.25, 754.19, 955.14, 1156.09, 1357.04]
    
    # create a column of bins
    df['bins'] = pd.cut(df.a, bins=bins)
    
    # groupby the bins and plot
    df.groupby('bins')['a'].count().plot.bar()
    

    # matplotlib plot
    plt.hist(x=df.a, bins=bins)
    plt.ylabel('Frequency')
    plt.show()
    
    # or dataframe plot
    df.a.plot.hist(bins=bins)
    plt.show()
    

    【讨论】:

    • 非常感谢!这正是我想要的
    • @MHernandez22 不客气。我很高兴这有帮助。
    【解决方案2】:

    如果您想定义一个范围,您最常将其作为keyword argument (kwarg) 传递给函数,在本例中为range。它会是这样的:

    plt.hist(nuevo_edad, range=(-2*stdev,2*stdev))
    

    请注意,您不会传递集合(如 range(a, b)),hist 中的参数 range 是两个元素的元组。

    PS:这只会影响您要绘制的数据。如果不是这样,您的意思是直方图中需要多少条柱,请使用参数bins

    例子:

    plt.hist(nuevo_edad, bins=20, range=(-2*stdev,2*stdev))
    

    这会将-2*stdev2*stdev 之间的所有数据绘制成20 个柱状图。

    【讨论】:

    • 谢谢!我也去试试。
    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 2017-01-29
    • 2019-04-14
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多