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))
在这里强调一下 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()