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

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()

Groupby 练习,分组后按照不同的要求计算:

你可能感兴趣的:(pandas 之 groupby,【matplotlib】plot()kind参数表,groupby)