1、groupby方法
groupby方法可以根据索引或字段对数据进行分组。
格式为:
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['yes','no','yes','yes','no'],'data1':np.random.randn(5),'data2':np.random.randn(5)}) print(df)
grouped = df['data1'].groupby(df['key2'])
grouped = df['data1'].groupby(df['key1'])
print(grouped.size())
print(grouped.mean())
输出结果:
1.1按列名分组
df = pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['yes','no','yes','yes','no'],'data1':np.random.randn(5),'data2':np.random.randn(5)}) print(df) # grouped = df['data1'].groupby(df['key1'])
# print(grouped.size())
# print(grouped.mean())
grouped = df.groupby('key2').mean()
print(grouped)
1.2按列表或元素进行分组
df = pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['yes','no','yes','yes','no'],'data1':np.random.randn(5),'data2':np.random.randn(5)}) print(df)
wlist = ['w','w','y','w','y']
df1 = df.groupby(wlist).sum()
print(df1)
1.3 按字典分组
df = pd.DataFrame(np.random.normal(size=(6,5)),index=['a','b','c','A','B','C'])
print(df)
wdich = {'a':'one','b':'two','c':'three','A':'one','B':'two','C':'three'}
print('分组后:\n',df.groupby(wdich).sum())
输出结果:
1.4 按函数分组
def jud(x):
if x>=0:
return 'a'
else:
return 'b'
df = pd.DataFrame(np.random.randn(4,4))
print(df)
print(df.groupby(df[3].map(jud)).sum())
输出结果:
1.5、常用的聚合函数
1.6 transform方法
可以将运算分布到每一行
data = pd.read_excel('data//testdata.xls')
print(data.head())
d = data.groupby(['性别','是否吸烟'])['血小板计数'].transform('mean').sample(5)
print(d)
输出结果:
二、数据的透视表
1、pivot_table
默认计算平均值
data = pd.DataFrame({'k1':['a','b','a','a','c','b','a','b'],'k2':['one','two','one','two','one','three','three','one'],'w':np.random.rand(8),'y':np.random.randn(8)})
print(data)
d = data.pivot_table(index='k1',columns='k2',aggfunc='sum')
print(d)
2、交叉表(crosstab)
注:margins=True表示加一列汇总项
data = pd.DataFrame({'k1':['a','b','a','a','c','b','a','b'],'k2':['one','two','one','two','one','three','three','one'],'w':np.random.rand(8),'y':np.random.randn(8)})
#print(data)
d = pd.crosstab(data.k1,data.k2,margins=True)
# margins表示加一列汇总项
#d = pd.crosstab(data.k1,data.k2)
print(d)
输出结果:
二、Pandas的可视化
1、需要在pycharm上安装matplotlib第三方插件,(File-Setting)
1、Series的plot的绘制折线
data = pd.Series(np.random.normal(size=10)) print(data) data.plot() #Jupyter plt.show()#如果用的是Pycharm,则需要show()
2、DataFrame的plot的方法绘图
df = pd.DataFrame({'normal':np.random.normal(size=50),'gamma':np.random.gamma(1,size=50)}) df.plot() plt.show()
3、柱状图
一般用来描述各类别之前的关系,plot函数中加入参数(kind='bar'),也可以绘制水平柱状图( kind='barh')
stu = {'name':['小明','王芳','赵平','李红','李涵'], 'sex':['male','female','female','female','male'], 'year':[1996,1997,1994,1999,1996]}
data = pd.DataFrame(stu)
#性别的个数
print(data['sex'].value_counts())
#性别的个数以柱状图的形式表示 data['sex'].value_counts().plot(kind='bar',rot=30)
plt.show()
输出结果:
4、横向柱状图 barh
如果要 在绘图上显示中文,需要加入下面两行
#用来显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False
#用来显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False
df = pd.DataFrame(np.random.randint(60,100,size = (3,3)),index = {'小明','小红','小丽'},columns = ['英语','数学','语文'])
print(df) df.plot(kind = 'barh')
plt.show()
输出结果:
5、直方图
用hist方法绘制
#直方图 s = pd.Series(np.random.normal(size = 80)) #bin:(箱子)的个数,也就是总共有几条条状图 s.hist(bins = 15,grid = False) plt.show()
6、散点图
散点图主要用来表现数据之间的规律。
通过plot函数的kind = 'scatter'可以进行绘制
a = np.arange(10)
wd = pd.DataFrame(a,columns=['A'])
wd['B'] = 2*wd['A']+4 print(wd) wd.plot(kind='scatter',x='A',y='B')
plt.show()
输出结果: