欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pandas 之 groupby,【matplotlib】plot()kind参数表

程序员文章站 2022-03-18 20:41:12
...

https://www.jianshu.com/p/42f1d2909bb6
https://blog.csdn.net/jinlong_xu/article/details/70175107 版权声明:本文为CSDN博主「Jinlong_Xu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

来源:简书

a ={'Sex':pd.Series(['male','female','male','male','male','female']),
    'area':pd.Series(['Shanghai','Beijing','Jiangsu','Shanghai','Zhejiang','Zhejiang','Shanghai']),
    'salary':pd.Series([5000,2000,8000,6000,8000,3000,2000]),
    'age':pd.Series([25,30,40,30,40,36])}
df = pd.DataFrame(a)

      Sex      area  salary   age
0    male  Shanghai    5000  25.0
1  female   Beijing    2000  30.0
2    male   Jiangsu    8000  40.0
3    male  Shanghai    6000  30.0
4    male  Zhejiang    8000  40.0
5  female  Zhejiang    3000  36.0
6     NaN  Shanghai    2000   NaN

基本操作:

最基本的就是组内计数, 求和, 求均值, 求方差, 求blablabla…
求平均值: NaN的值是不统计的!!!

df.groupby('Sex')['salary'].mean()

Sex
female    2500
male      6750
Name: salary, dtype: int64

上面我们求得了平均数, 得到的是一个Series, 每一行对应了每一组的mean, 除此之外你还可以换成std, median, min, max, sum 这些基本的统计数据

上面是连续属性, 我们还可以操作离散属性, 比如对不同取值的计数: .value_counts()

df.groupby('Sex')['area'].value_counts()
Sex     area    
female  Beijing     1
        Zhejiang    1
male    Shanghai    2
        Jiangsu     1
        Zhejiang    1
Name: area, dtype: int64

注: 这时, 组内操作的结果不是单个值, 是一个序列, 我们可以用.unstack()将它展开

df.groupby('Sex')['area'].value_counts().unstack()
area    Beijing  Jiangsu  Shanghai  Zhejiang
Sex                                         
female      1.0      NaN       NaN       1.0
male        NaN      1.0       2.0       1.0

方法总结

首先通过groupby得到DataFrameGroupBy对象, 比如data.groupby(‘Sex’)

然后选择需要研究的列, 比如[‘salary’], 这样我们就得到了一个SeriesGroupby, 它代表每一个组都有一个Series

对SeriesGroupby进行操作, 比如.mean(), 相当于对每个组的Series求均值

注: 如果不选列, 那么第三步的操作会遍历所有列, pandas会对能成功操作的列进行操作, 最后返回的一个由操作成功的列组成的DataFrame

df.groupby('Sex').sum()
        salary    age
Sex                  
female    5000   66.0
male     27000  135.0

可视化:

能够帮你很轻松地分组画图, 免去手写每个组的遍历的烦恼, 还能为你每个组分好颜色.

条形图:

df.groupby('Sex')['area'].value_counts().unstack().plot(kind = 'bar',figsize = (15,5))

df.groupby('area')['age'].sum().plot(kind = 'bar',figsize = (15,5))

【matplotlib】plot()kind参数表

在这里强调一下 kind参数——‘line’, ‘bar’, ‘barh’, ‘kde’
直方图:是一种可以对值频率离散化显示的柱状图。通过调用Series.hist()方法即可创建。
密度图:与直方图相关的一种类型图,是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的,通过给plot传入参数kind = ‘kde’ 即可。
散布图:是观测两个一维数据序列之间关系的有效手段,使用pd.scatter_matrix()即可建立。

有时我们需要对组内不同列采取不同的操作

1.DataFrameGroupby, 也就是说, 每一组都有一个DataFrame
2.我们把对这些DataFrame的操作计划写成了了一个字典
3.然后进行agg, (aggragate, 合计)

df.groupby('Sex').agg({'salary':np.sum,'age':np.median})
        salary   age
Sex                 
female    5000  33.0
male     27000  35.0

我们需要同时求不同组内, 同一列的均值, 中位数, 方差

注意这里agg接受的不一定是np.mean这些函数, 你还可以进行自定义函数哦

df.groupby('Sex')['age'].agg([np.sum,np.mean,np.max,np.min])
          sum   mean  amax  amin
Sex                             
female   66.0  33.00  36.0  30.0
male    135.0  33.75  40.0  25.0

现在我们对一个SeriesGroupby同时进行了多种操作. 相当于同时得到了这几行的结果:

df.groupby('Sex')['age'].sum()
df.groupby('Sex')['age'].mean()
df.groupby('Sex')['age'].max()
df.groupby('Sex')['age'].min()
相关标签: python 数据分析