【python】-2 pandas
1.1 读取文件注意:
1)不要尝试读取excel文件(不便于解析),最好使用通用的csv或者txt格式
2)注意编码问题,使用excoding参数
3)注意处理报错
1.2 DataFrame 和 Series
DataFrame:二维数据框(一个or多个Series)
Series:一维有标签的任意结构(表的一行or一列)
应用:
1)将字典导入Series:a={}, pd.Serise(a),将key作为index,value作为值保存
a={'name':'grace','age':18,'sex':'female'}
pd.Series(a)
name grace
age 18
sex female
dtype: object
2)传入列表,并制定索引:g=[],pd.Series(g,index="……")
不制定索引,则自动生成0开头的索引。
g=[1,3,5,2,4,6]
pd.Series(g,index=list("qwezxc"))
q 1
w 3
e 5
z 2
x 4
c 6
dtype: int64
1.3 常用操作
查看属性:
1)columns:返回列名
score.columns #列名称
Index(['省份', '学生ID', '考期', '科目', '分数', '描述', '是否通过', '小组', '班主任', '学员名称', '家族', '子订单id', '预估分.1', '分数区间'], dtype='object')
2)index:返回索引
score.index
RangeIndex(start=0, stop=8868, step=1)
3)dtypes:返回每一列的类型
score.dtypes
省份 object
学生ID int64
考期 int64
科目 object
分数 int64
描述 float64
是否通过 int64
小组 object
班主任 object
学员名称 object
家族 object
子订单id int64
预估分.1 int64
分数区间 object
dtype: object
4)shape:返回一个数据框有几行&几列
score.shape
(8868, 14)
5)size:数据框有多少元素:8868*14
score.size
124152
方法使用:
1)head:返回文件前x行(默认5)
2)tail:返回文件倒数x行(默认5)
3)rename:score.rename(columns={旧名字:新名字})
score.rename(columns={'学生ID':'学员ID'})
4)replace:查找并替换值 score.replace({'列':{'旧名':'新名'}})
score.replace({'学生姓名':{'周亚亭':'周亚婷'}})
5)unique:
score.省份.value_counts() #返回不同值&出现的次数,series 形式
score.省份.unique() #返回不同值 ,numpy 形式
6)sort_values: 根据指定列进行排序,默认升序&行排序: data.sort_values(['列1','列2','列3'])
data.sort_values(['stu_id','科目名称','课程名称'])
7 ) describe:查看数据的统计值(计数,标准差,最值。。。)
8)max/min/sum/mean :
默认对列求值。对行可以改为 axis=1
*** pandas 中的方法,都是产生新数据集,不会修改原数据。如果想修改原数据,可以通过1)赋值 2)参数设置:inplace=true
***查看帮助文档:?score.方法
*** 数据选取、添加、删除:
9)选择数据
选择一列:data['课程ID']
选择多列:data[['课程ID','模块ID',……]]
10 ) 添加一列:
增加一列class,赋值1:data['class']=1
···
11)删除一列:
注意,这里针对列操作,用del
···
del data['class'] # del +‘空格’+数据框[''列名'']
1.4 处理Missing value
pandas shiyong numpy.nan 代表缺失值,缺失值不会被程序计算。处理方式为:
1、删除含有缺失值的行;
2、填充缺失值
#检测某一列数据是否为空,返回布尔值
pd.isnull(data['模块ID'])
1、删除表中含有缺失值的行
1)针对整个数据框,只要某一个元素为空,对应的行就被删除)
data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
2) 针对列,只要含有空,就删除对应列
data.dropna(axis=1)
3)针对行:只有所有项均为nan,才删除
data.dropna(how='all')
4)指定nan个数的行列进行删除:
data.dropna(axis=1,thresh=3) #将在列的方向上3个为NaN的项删除
data.dropna(thresh=2) #将在行的方向上2个为NaN的项删除
5)对指定列含nan的项进行删除:
data.dropna(subset=['column1',‘column2’])
2、填充缺失值:fillna
1)data.fillna(0) #填充0
2)data.fillna(method='pad/ffill') #用前一个值填充空值(向下填充)
3)data.fillna(method='backfill/bfill') #用后一个值填充空值(向上填充)
4)对不同列的空值,用不同的值来填充:
values={'子订单':111,'课程ID':222,'直播时长min':0}
data.fillna(value=values)
子订单的空值用111填充,课程ID用222填充,直播时长空值用0填充
5) 限制填充行:
data.fillna(value=values, limit=1) # 只对第一行进行填充
1.5 文本数据
DataFrame 和 Series中常常有文本格式的数据存在,pandas提供了良好的工具处理这些文本。
1 )删除空格:str
s=pd.Series(['A','b','C','D ',' Alibaba',' Circel'])
s.str.strip()
1.6 索引
1.6.1 loc 基于索引标签名称
- 根据索引位置选取指定列
data.loc[[1,3,5]]
- 根据指定列名的列选择数据范围
data.loc[data['直播时长min']>=60]
1.6.2 iloc 基于索引位置
data.iloc[:5] #这里根据位置索引,所以返回5条数据。相当于前闭后开。
5 rows × 29 columns
对比:
data.loc[:5] # 这里根据名称,选择到索引名称为5的列。所以返回6列。
6 rows × 29 columns
- 指定列设置为索引: set_index('column_name')
data1=data.set_index('stu_id')
data1.loc[:5] #报错:因为索引变成了id,这里根据索引名称切片,没有名称为5的索引
data1.iloc[:5] # 成功,这里按照索引位置选取5行
- 对列进行操作:
选择某些列[ , [ ? ]]
data.loc[:10,['college_name','学生姓名']]
# 选择数据的前11行(截止标签为10),列为'college_name','学生姓名'的数据。
data.iloc[:10,[2,3]]
# 选择数据的前10行,列位置为 2,3 的数据。这里的2,3是位置,写为列名会报错
1.6.3 数据过滤
筛选班主任姓名为aaa 的学员数据
data.loc[data['班主任']=='aaa']
选择直播超过30min的或者重播超过30min的选择出来
data.loc[(data['直播时长min']>=10)|(data['重播时长min']>=30)]
将筛选出来的数据新建一个标签,值为high
data.loc[(data['直播时长min']>=10)|(data['重播时长min']>=30),"flag"]='high'
1.6.4 多重索引
设置两层索引
data2=data.set_index(keys=['班主任','授课老师'])
选择班主任为aaa,授课老师为刘星的数据
data2.loc['aaa','刘星']
使用sclice(None)表达在某个level上的选取全部的内容,不需要对全部level进行指定。
data2.loc[(['刘星'],slice(None)),:]
第一索引上筛选,从第二索引不筛选
data2.loc[(['刘星'],slice(None)),:]
第二索引上筛选,从第一索引不筛选
data2.loc[(slice(None),['夏利']),:]
行列筛选:IndexSlice-一种更接近自然语法的用法,可以替换slice
比如,选择夏利老师教授的所有学生和对应班主任:
idx=pd.IndexSlice
data2.loc[idx[:,['夏利']],:idx['学生姓名']]
选择夏利老师教授的班主任为aaa的所有学生:
data2.loc[idx[['aaa'],['夏利']],:idx['学生姓名']]
1.7 分组统计:group by
1.7.1 统计计算
- 单个统计量
- 多个统计量
- 不同列对应不同统计量
注意:分组计算很重要的一点:我们每一个统计函数都是作用在每一个grouped上面,不是单个样本,也不是全部样本。
单个统计量
df=pd.read_csv(r'/Users/…../movie.csv')
df.head()
grouped=df.groupby('director_name') # 根据导演的名字进行分组
grouped.size() #多少组,每组多少数据;导演出现时次数——作品数量
grouped.groups # 每个分组包含了多少数据:数据以分组形式展示
grouped.mean() #对每一列根据分组进行求均值
grouped['duration'].sum() #只针对某个特征进行计算
多个统计量计算
利用agg函数进行多个统计量计算
import numpy as np
grouped.agg([np.mean,np.sum,np.std]) #求出每个组别(导演)对应特征的平均数, 总和,标准差
grouped['duration'].agg([np.mean,np.sum,np.std])# 只针对分组后某个特征求均值,总和,标准差
mean sum std
director_name
A. Raven Cruz 97.000000 97.0 NaN
Aaron Hann 87.000000 87.0 NaN
Aaron Schneider 100.000000 100.0 NaN
Aaron Seltzer 85.000000 85.0 NaN
Abel Ferrara 99.000000 99.0 NaN
不同的列做不同的统计量:
对一特征求均值,二特征求和
grouped.agg({'duration':np.mean,'director_facebook_likes':np.sum})
1.7.2 transformation:标准化
标准化之前,需要对数据做缺失值处理。未做处理会出现错误值。
缺失值处理:用0填充
df1=df.fillna(0)
grouped=df1.groupby('director_name')
#对某一列做标准化
#定义标准化函数
z_score=lambda s:(s-s.mean())/s.std()
df1.shape
(5043, 28)
#确定对哪一列进行标准化
grouped[['num_critic_for_reviews','director_facebook_likes','duration']].transform(z_score)
image.png
1.7.3 Filteration对分组后的数据做过滤
grouped.filter(lambda g:len(g)>1) #过滤并选择那些数据量大于1的显示
image.png