目录
前言
一、排序
1.使用索引排序
2.使用变量值排序
二、计算新变量
1.新变量为常量
2.根据原变量新增列
3.基于一个原变量做函数运算
4.在指定位置插入新列
三、修改替换变量值
1.对应数值替换
2.指定范围替换
四、虚拟变量变换
五、数值变量分组
六、数据分组
七、分组汇总
八、数据合并
1.merge()
2.concat命令
九、处理缺失值
1.查看缺失值
2.判断是否有缺失值
3.填充缺失值
4.删除缺失值
十、数据去重
1.标识出重复的行
2.删除重复行
总结
前言
前两篇讲了pandas库的一半,
Numpy&Pandas:pandas库的安装,Pandas库(0-25%)-CSDN博客
Numpy&Pandas:Pandas库(25%-50%)-CSDN博客
今天这篇一口气将pandas库剩下的一半全讲完。
一、排序
1.使用索引排序
- 多列索引时用level='' 选择使用什么索引进行排序
# 使用索引排序 多列索引时用level='' 选择使用什么索引进行排序
stu_df.sort_index(ascending = False) # 按照默认索引排序 ascending控制升降序
输出:默认 ascending = False
2.使用变量值排序
# 使用变量值排序
stu_df.sort_values(['age','id'],ascending=[False,True]).reset_index(drop = True)
# 先根据age进行降序 再根据id进行升序 reset_index将索引还原 drop=True 会将原索引直接删除
输出:
二、计算新变量
1.新变量为常量
stu_df['g'] = 100 # 新变量为常数
输出:
2.根据原变量新增列
stu_df['gg'] = stu_df['age']*10 # 根据原变量新增列
输出:
3.基于一个原变量做函数运算
stu_df['22']=stu_df.apply(lambda x: x['age'] if x['age']==22 else 0 ,axis = 1)
# axis=1 将每一行的元素传进apply函数进行操作
stu_df['22'] = stu_df.apply(lambda x: x['name'] if x['age'] == 22 and x['clazz'] == '文科六班' else 0 ,axis = 1)
输出:
4.在指定位置插入新列
stu_df.insert(1,'aaa',100) # 在指定位置插入新列
输出:
、
三、修改替换变量值
1.对应数值替换
# 对应数值替换 先定位 再替换
stu_df.name[1] = 'tokyo' # 在name列的第一个位置替换
stu_df['name'][2] = 'suda'
stu_df.loc[1,'age'] = 30 # 将行索引为1的行中的age列的值替换成30
stu_df
输出:先定位 再替换
2.指定范围替换
# 指定范围替换
stu_df.clazz[stu_df.clazz=='文科六班'] ='文六' # 将clazz中的文科六班替换成文六
stu_df.age[stu_df.age==22] = 21 # 将age中的22替换成21
stu_df.replace(['男','女'],[1,0],inplace=True)
stu_df.replace({'男':1,'女':0},inplace=True) # 与上一行作用一样
# 将stu_df中所有包含'男'的值替换为1 所有包含'女'的值替换为 0
# inplace=True表示在原地修改
stu_df
输出:
四、虚拟变量变换
# 虚拟变量变换
pd.get_dummies(stu_df.gender) # 只有两个类别时
输出:
五、数值变量分组
# 数值变量分组
stu_df['qcut'] = pd.qcut(stu_df.id,q = 4) # 按数量分成四段
# stu_df.age.unique() # 查看数据框某列有什么数值
# stu_df['qcut'] = pd.qcut(stu_df.age,q = 3,duplicates='drop')
stu_df['cut'] = pd.cut(stu_df.age,bins = [20,21,23,24,30]) # 在bins里指定每段的左右界,默认左开右闭
stu_df
输出:
六、数据分组
# 数据分组
stu_df.groupby('cut').groups # 按照cut里的分段将数据框的索引进行分组
stu_df['clazz'] = stu_df.apply(lambda x:'文科六班' if x['clazz']=='文六' else x['clazz'] ,axis = 1) # 将clazz里的文六替换成文科六班
stu_df.groupby(['clazz','gender'])['age'].mean() # 先按clazz分组 再在clazz里按gender分组 然后将每个组的年龄平均值打印出来
输出:分组之后输出的是Series数据类型
七、分组汇总
# 分组汇总
stu_df.groupby('clazz')['age'].agg(['mean','median'])
# 按clazz分组 获取age的平均值 中位数 再用agg将其汇总
输出:
八、数据合并
left=pd.DataFrame({'key':['k0','k1','k2','k3'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3'],})
right=pd.DataFrame({'key':['k0','k1','k2','k4'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2',
1.merge()
- 内连接 只保留相同key的值
# inner left right
# 内连接 只保留相同key的值
# 外连接 left 以左边的df为基准 保留所有的左边的所有同列名的值
# 全连接 outer 全连接
pd.merge(left,right,how='inner')
输出:
- 外连接 left 以左边的df为基准 保留所有的左边的所有同列名的值
- right同理
- 全连接 保留所有的key
pd.merge(left,right,how='outer') # 全连接 保留所有的key
输出:
2.concat命令
- 同时支持横向合并与纵向合并
- 默认 axis = 0 纵向合并 axis = 1 横向合并
九、处理缺失值
df=pd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]])
df
1.查看缺失值
df.info() # 查看缺失值 total 3 columns 每一行应该有三个数值
# 但 1 2 两行都只有梁非空值 所以 1 2 各有一个缺失值
输出:
2.判断是否有缺失值
df.isna() # 判断是否为缺失值 True即为缺失值
df[df[1].isna()] # 获取含有空值的单行的值
df.isna().any() # 检查每一列是否有缺失值
输出:.any()方法默认检查列 可以使用参数axis = 1 检查每一行
3.填充缺失值
# ffill front bfill back axis默认为0 即垂直方向 axis=1 是水平方向
df.fillna(10) # 用10 将缺失值填充
df.fillna(method='bfill') # 用缺失值下面的值进行填充
df.fillna(method='bfill',axis = 1) # 用缺失值右边的值进行填充
df.fillna(method='ffill') # 用缺失值上面的值进行填充
df.fillna(method='ffill',axis = 1) # 用缺失值左边的值进行填充
for i in df.columns:
df[i]=df[i].fillna(np.nanmean(df[i])) # 使用缺失值同一列数值的平均值进行填充 说明缺失值不参与计算
df
输出:输出的是最后一行代码 ,中间几种情况的输出建议各位用jupyter操作一下,有助于理解
4.删除缺失值
- 一般不会删,而是进行填充
# 删除缺失值
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('默认为以行为单位剔除:')
df.dropna()
print('以列为单位剔除:')
df.dropna(axis='columns')
输出:
十、数据去重
1.标识出重复的行
# 标识出重复的行
# pd.set_option('display.max_rows', None)
# stu_df.duplicated(['name','gender'])
# 先用name和gender判断 相同为True 不同为False 再用bool取值
stu_df[stu_df.duplicated(['name','gender'])]
输出:
2.删除重复行
# 删除重复行
stu_df.drop_duplicates(keep = 'first') # keep = 'first' 删除重复行中的第一行
stu_df[~stu_df.duplicated(['name','gender'])] # 利用查重标识结果直接删除
输出:数据总行数减少了4 ,所以有4行被删除。
总结
Pandas库讲完了。刚好十条,十全十美,哈哈哈哈。