Pandas3.1(基本操作)
2023-03-03 本文已影响0人
山猪打不过家猪
1.PANDAS读取表以及基本信息
1.1读取指定分隔符无头的csv
image.pngfpath = "./datas/access_pvuv.txt" #relative path
df = pd.read_csv(
fpath,
sep = "\t", ##separator
header = None, ##no headers
names = ["pdata","pv","uv"] ##costom own column name
)
1.2读取表的基本信息
1.2.1表的信息所有信息
df.info()
image.png
我们可以看出,总共4238行,但是其中有几行的数据少于这个数,所以这几行的数据是有NAN
1.2.2 读取表的所有信息简版
df.shape
(3656, 16)
1.3 读取列名
- 直接读取
df.columns
>>>
Index(['male', 'age', 'education', 'currentSmoker', 'cigsPerDay', 'BPMeds',
'prevalentStroke', 'prevalentHyp', 'diabetes', 'totChol', 'sysBP',
'diaBP', 'BMI', 'heartRate', 'glucose', 'TenYearCHD'],
dtype='object')
- 读取表头
df.head(0)
image.png
2.缺失值
2.1缺失值查看
2.1.1 查看所有含有缺失值的列
df.isnall().any(axis=0)
image.png
2.1.2 查看所有含有缺失值的行
- 查出有缺失的行
df.isnall().any(axis=1).sum()
- 统计缺失行的数量
df.isnall().any(axis=1).sum()
>>>
582
2.1.3 查出指定列名的缺失
- 查询education列的缺失
df["education"].isnull().sum()
>>>
105 #总共缺失了105个数
2.1.4 查出所有缺失行的所有数据
df[df["education"].isnull()]
image.png
2.2缺失值删除
2.2.1 删除所有具有NAN的行
- 不在原表中删除
df.dropna()
2.2.2删除全部为NAN的行
df.dropna(how='all')
2.2.3 替换
- 默认是不替换,需要拷贝新的dfd
- 替换,可以直接一直用
df.dropna(inplace=True)
2.3缺失值填补
2.3.1 用下面一行的值填充
df.fillna(method="backfill")
2.3.2 用上面一行的值填充
df.fillna(method="pad")
2.3.3 用这一列的平均值/中位数/0 填充
- 平均值
df.fillna(df.mean())
- 中位数
df.fillna(df.median())
- 0
df.fillna(0)
3.DataFrame切片
3.1 获取行
- 获取前2行
df[:2]
image.png
3.2获取列
- 获取一列
df['currentSmoker']
- 获取多列
df[['currentSmoker','age']]
image.png
3.3 loc和iloc
3.3.0 设置索引
- 将ymd列作为索引
df.set_index('ymd',inplace=True)
能做索引的列,一定是唯一且不重复的列
3.3.1 loc[行,列] 索引
- 使用loc第二列的数,下标从0开始
df.loc[1]
- 获取前五行,列名是male 和age的数据
df.loc[0:4,['male','age']]
image.png
3.3.1 iloc[行索引,列索引] 索引的下标
在使用默认的Index时候,iloc和loc的用法是一样的
3.4 根据条件获取行和列
3.4.1列名+条件获取
- 获取成绩大于60的所有数据
df[df['age']>60]
image.png
- 获取成绩大于60的人数统计
(df['age']>60).sum()
>>>
597
- 获取年龄大于60的列的male和education列的前5行
df[df['age']>60][['male','education']][0:5]
image.png
3.4.2loc[条件,列名]
- 获取年龄大于60,列名为male和education
df.loc[df['age']>60,['male','education']]
image.png
3.4.3 通过.values先判断出结果的布尔值,在选择
- 大于60的布尔值
(df['age']>60).values
>>>
array([False, False, False, ..., False, False, False])
- 再获取
df[(df['age']>60).values]
4. 表连接
4.1横向连接merge
类似于sql的 inner join/left join
4.1.1 连接的列名一样
- 学生信息stu_info:学生 姓名,ID,年龄,学号
- 学生成绩stu_score:学号,数学成绩,语文成绩
pd.merge(stu_info,stu_score,on='stuId',how='left')
image.png
4.1.2连接的列名不一样
学生表里的学生学号是:userId
成绩表里的学号是:stuId
pd.merge(stu_info,stu_score,left_on='userId',rigth_on = 'stuId',how='left')
image.png
- 上面连接后,会多出一列,删除
df.drop('stuId',axis=1)
- 修改列名
df.rename(columns={'userId': 'studentId'}, inplace=True)
4.1.3连接两个使用默认index的表
score1 =pd.DataFrame({'score_a':[100,90,80]},index=['001','002','003'])
score2 =pd.DataFrame({'score_b':[56,44,30]},index=['001','002','003'])
image.png
pd.merge(score1,score2,left_index=True,right_index=True)
image.png
4.2纵向连接concat
类似于sql里的union join
pd.concat[[stu1,stu2]]
image.png
5.行转列,列转行
5.1行转列
image.pngdf = df.pivot(index='student',columns='subject',values='score')
- columns:需要转成列的字段
- values: 需要转成列的值
5.2 列转行
image.pngimage.png
image.png
6. 排序和频率
6.1 给指定字段排序
- 根据教育程度升序排列
df.sort_values(by='education',ascending = False)
- 根据教育程序升序,根据年龄降序,对应
df.sort_values(by=['education','age'],ascending = [False,True])
image.png
6.2取到排序后的表添加新的排序
按照分数降序排列,给排序好的表添加一个rank从第一名到最后一名
df.sort_values(by='score',ascending = False,inplace=True)
df['rank']= df['score'].rank(method='first',ascending=False)
df
image.png
6.3 统计次数
- 统计education的频率
df['education'].value_counts()
>>>
1.0 1720
2.0 1253
3.0 687
4.0 473
Name: education, dtype: int64
- 转换为百分比
df['education'].value_counts(normalize=True)
>>>
1.0 0.416163
2.0 0.303170
3.0 0.166223
4.0 0.114445
7.将函数作用在行和列
7.1 apply 处理整行和整列
- 找出所有列的极差
axis =0 对列进行操作 axis=1对行进行操作
df.apply(lambda x:x.max()-x.min())
image.png
- 找出所有列的最大值
df.apply(lambda x:x.max())
image.png
7.2 applymap 对表进行操作
- 将全表的小数转为两位
df.applymap(lambda x:'%.2f'%x)
image.png
7.3 map对单独的行进行操作
- 将totChol这行的数据转为2为小数
df['totChol'].map(lambda x:'%.2f'%x)
image.png
8.异常值
8查找异常值
8.1.1直接指定范围
- 找出年龄小于0的数据
df[df["age"]<0]
- 找出
totChol
大于500的dataframe
df[df["totChol"]>500]
image.png
8.1.2 绝对值查找
import numpy as np
df[np.abs(df["totChol"])>500]
8.1.3 散点图查找
构建一个年龄为横坐标,totChol为纵坐标的离散图
plt.scatter(df["age"],df["totChol"])
plt.show()
image.png
3.1.4 箱线图查找
9. 重复值
9.1 查找表中重复值
df[df.duplicated()]
9.1.1 删除重复值
- 无条件删除,将完全相同的列进行去重
df.drop_duplicates()
- 指定字段删除,对user_id分组去重
df.drop_dupliates(['user_id')])
- 直接在原来的表中生效
dr.drop_duplicates(keep=False, inplace=True)