Pandas3.1(基本操作)

2023-03-03  本文已影响0人  山猪打不过家猪

1.PANDAS读取表以及基本信息

1.1读取指定分隔符无头的csv

image.png
fpath = "./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 查出指定列名的缺失

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 替换

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())
df.fillna(0)

3.DataFrame切片

3.1 获取行

df[:2]
image.png

3.2获取列

df['currentSmoker']
df[['currentSmoker','age']]
image.png

3.3 loc和iloc

3.3.0 设置索引

df.set_index('ymd',inplace=True)

能做索引的列,一定是唯一且不重复的列

3.3.1 loc[行,列] 索引

df.loc[1]
df.loc[0:4,['male','age']]
image.png

3.3.1 iloc[行索引,列索引] 索引的下标

在使用默认的Index时候,iloc和loc的用法是一样的

3.4 根据条件获取行和列

3.4.1列名+条件获取

df[df['age']>60]
image.png
(df['age']>60).sum()
>>>
597
df[df['age']>60][['male','education']][0:5]
image.png

3.4.2loc[条件,列名]

df.loc[df['age']>60,['male','education']]
image.png

3.4.3 通过.values先判断出结果的布尔值,在选择

(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 连接的列名一样

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.png
df = df.pivot(index='student',columns='subject',values='score')

5.2 列转行

image.png
image.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 统计次数

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 处理整行和整列

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对单独的行进行操作

df['totChol'].map(lambda x:'%.2f'%x)
image.png

8.异常值

8查找异常值

8.1.1直接指定范围

df[df["age"]<0]
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()

df.drop_dupliates(['user_id')])
dr.drop_duplicates(keep=False, inplace=True)
上一篇下一篇

猜你喜欢

热点阅读