Pandas学习笔记

1.常用的数据结构有:Series,DataFrame

Series的创建:

import pandas as pd
series1=pd.Series([1,2,3,4],index=['a','b','c','d'],name='practice')

Series的对象可以是列表、字典和数组,其中字典的键即为索引

Series常用属性有:values以数组形式呈现数值(pandas的建立是基于numpy)、index、dtypes、ndim

方法有append()用于拼接,drop()删除但不改变原序列,若想改变,需设置参数inplace=True

DataFrame可看作是由多个Series组成的,或理解为Series是DataFrame的一列。

DataFrame的创建:

常用属性有:values、shape、dtypes、columns、ndim、size、index

to_list()方法可用列表形式查看

2.数据获取和保存

技巧:先修改运行路径,再读取文件

import os
os.getcwd() # 获取当前路径
os.chdir('文件存储路径') # 将Python运行路径改为文件存储路径
df=pd.read_csv('文件名.csv',encoding='gbk',dtype={'id':str},nrows=n,sep=',',na_values='暂无') # 当文件中存在大量中文时,encoding宜设置为gbk,nrows只读取前n行,默认以,分割,na_values设
     # 置将“暂无”读取为缺失值

注:pandas默认将第一行作为表头

常用方法:head(n)查看前n行、tail(n)查看后n行、dtypes属性查看每一列的数据类型,其中object一般指字符串类型

读取excel文件,参数sheet_name用于指定读取的表

df=pd.read_excel('文件名.xlsx',encoding='utf-8',sheet_name='')

concat()用于拼接数据,ignore_index=True用于索引设置。

数据保存:

data.to_csv/to_excel(data.csv/xlsx,index=False) index表示不写入索引

3.数据筛选

查看前n行:df[:n]

查看某一列:df.column_name或df[‘column_name’]

查看某一列前n行:df[‘column_name’][:n]

loc与iloc:

df.loc[A,B]其中A,B分别为行索引、列索引的 名称

df.iloc[A,B]其中A,B分别为行、列的 位置,即索引值

因而loc方法更加灵活

4.条件查询与增删改查

逻辑运算符:&与、|或、~非用于连接条件

注:条件与条件之间要有()

1)判断是否在某一区间内df[column].between(a,b,inclusive=True)inclusive=True表示包含a,b

2)判断a中是否包含b df[‘a’]isin([‘b’])或df[‘a’].str.contains(‘b’)

删除a :df.drop(‘a’, axis=1)注:设定参数inplace=True时,原数据才改变

del(df[‘a’])直接在原数据上进行删除

增加列:df.insert(index,column_name,data)

删除 :df.drop(labels, axis=0,inplace=True)

修改:df.loc[df[‘id’]==1,’id’]=100直接在原数据上进行修改,先取出id=1的行,再将其id改为100

修改列名:df.rename(columns={‘a’:’A’},inplace=True)

修改索引名:df.rename(index={1:’001′},inplace=True)

描述统计:df.describe()

5.数据库数据读取和保存

import pymysql
from sqlalchemy import create_engine
import pandas as pd

建立连接的固定语法:create_engine(‘mysql+pymysql://user:passward@IP:3306/database_name’)#3306为端口名

conn=create_engine('mysql+pymysql://root:l123456'@localhost:3306/test01)
sql='select * from table_name'
df=pd.read_sql(sql,conn)

方便起见,可编写一个函数用于连接数据库

def query(table):
    host='localhost'
    user='root'
    passward='l123456'
    database='test01'
    port=3306
    conn=create_engine('mysql+pymysql://{}:{]@{}:{}/{}'.format(user,passward,host,port,database))
    sql='select* from '+str(table) # from后要加一个空格
    results=pd.read_sql(sql,conn)
    return results

保存至数据库:

try:
    df.to_sql('testdf',con=conn,index=False,if_exists='replace')
except:
    print('error')

其中if_exists参数设置为replace表示替换,append为追加,fail无作为

6.数据整合

merged=pd.concat([df1,df2],axis=1,join=’inner’) join参数为inner表交集,outer表并集

合并后索引会错乱,可重置索引:df.reset_index(drop=True,inplace=True)若无drop=True,则索引成为一个新的变量

pd.merge(left=df1,right=df2,how=’right’,left_on,right_on)how的参数right为右连接,left左连接,inner内连接,left_on与right_on指定连接字段

对于合并两个具有重复列的数据集,处理思路是先找出不重复的列,再对不重复的列进行合并

cols_to_use=df2.columns.difference(df1.columns)
pd.merge(df1,df2[cols_to_use],how,left_index=True,right_index=True)

7.层次化索引:在一个轴上拥有两个或两个以上索引

读取文件时,设置参数index_col=[a,b]a,b为索引字段的索引值

8.数据排序

首先需判断是否有缺失值

df.isnull()判断是否有缺失值

np.sum(df.isnull(),axis=0)统计每列缺失值

df.sort_values(‘排序字段’,asceding=True,na_position=’last’,inplace=True)na_position参数设定为last表示将缺失值排在最后

排序后索引错乱,可用reset_index()重置

9.分组聚合,相当于sql中的group by

首先使用聚合函数,如寻找一列中的最小值:np.min(df.column_name)相当于df[‘column_name’].min(axis= 0)

对字符串型数据进行描述统计

df[‘字符串字段’].describe(include=’object’)

分类汇总:grouped=df.groupby(‘a’)以a为分类依据

grouped.max()/size()/count()/cumcount()组内索引

10.聚合函数

1)agg():grouped.agg([np.mean,np.sum]),grouped.agg({‘column2′:np.mean,’column3’:np.sum})

也可自定义函数,如

def DoubleSUM(data):
    S=data.sum()*2
    return S

grouped.agg({‘column_name’:DoubleSUM})

2)apply函数

df[‘column_name’].apply(np.sum,axis=0)

df[‘column_name’].apply(lambda x: x[0]-x[1],axis=1) 用第一列的值减第二列的值

3)transform函数(了解)不能输出聚合形式的结果

示例:grouped.mean().transform(lambda x:x*2)

df[column_name].transform(lambda x:x*2)

11.透视图和交叉表

1)透视图

pivot_table(data,index,columns,value,aggfunc,fill_value,margins,margins_value)其中value为浮点型或整型,margins为总计。

2)交叉表(通常用于统计频数、频率)

pd.crosstab(index,columns,margins,values,aggfunc,normalize)

normalize参数为’all’时计算在所有数据中出现的频率,为’index’时计算在行中出现的频率,为’columns’时计算在列中出现的频率。

12.数据预处理

1)日期格式处理:

pd.to_datetime(df[‘column_name’],format=’%Y年%m月’,errors=’coerce’)将日期数据转化为标准日期格式,返回的是视图,若想改变原数据,可设置inplace=True;format根据数据实际格式而定,errors=’coerce’非前述格式则处理为空值。

2)字符串处理:

df[‘column_name’].str[:-1].astype(‘float’)去掉字符串最后一个字并设置数据类型,应用场景:去掉数据的单位。

value_counts()统计数据出现的次数

df[‘column_name’].str.replace(‘A’,’B’)对字符串型数据进行替换,如将’–‘替换为’缺失值’

df.describe(include=’all’)对所有类型的字段进行描述统计,包含字符串型

3)计算时间差

df[‘diff_day’]=pd.datetime.today()-df[‘datetime_column’]

转换为天数:(df[‘diff_day’]/ np.timedelta64(1,’D’)).astype(int)以1天为周期,若以1周为周期,则设定为(7,’D’)

4)常用场景示例:

df[‘tel’]=df[‘tel’].apply(lambda x:x.replace(x[3:7],’****’))隐藏电话号码的中间四位,默认按行操作

df[’email’].apply(lambda x:x.split(‘@’)[1])以’@’将数据分成两段,取后一段,即取后缀

df[‘new_tel’]=df[‘tel’].str[0:3]或df[‘new_tel’]=df[‘tel’].apply(lambda x:x[0:3])取号码前三位

不重复抽样:data=df.sample(n,replace= False)

取出日期:df[‘date’]=df[‘column_date’]. dt.date

两列相乘得到新的字段:df[‘total_price’]=df[[‘Quantity’,’UnitPrice’]].apply(np.prod,axis=1)

统计每天的总计:grouped_data=data.groupby(by=’date’).sum()

将索引转换成日期格式:grouped_data.index=pd.to_datetime(grouped_date.index)

计算变化率:grouped_data[‘总价变化率’]=grouped_data[‘total_price’]. pct_change()

计算5日移动平均:grouped_data[‘SMA-5’]=grouped_data[‘total_price’]. rolling(5).mean()

把数据向下平移1个单位:grouped_data[‘total_price_before’]=grouped_data[‘total_price’]. shift(1)若为-1,则向上平移1个单位。

13.数据清洗

1)重复值处理

判断重复值:df.duplicated(subset,keep=’first’),subset设定判断的依据字段,keep=’first’保留第1个重复值,’last’保留最后一个。

统计有多少重复值:np.sum(df.duplicated(subset,keep))

删除重复值:df.drop_duplicates(subset,keep))

2)缺失值处理

查看缺失值情况:np.sum(df.is_null())默认axis=0

缺失率统计:df.apply(lambda x:sum(x.isnull())/ len(x))

剔除缺失值:df.dropna(how)how=’any’只要有就删除此行,how=’all’全部缺失才删除此行

df.drop(labels=[‘a,’,’b’],axis=1)删除a,b两列

df.dropna(subset,how,axis=0)

填充缺失值:df.column_name.fillna(df.column_name.mean()/mode()[0])mode()众数,一般取第一个进行填充。对多个字段进行填充时,可用字典形式:df.fillna(value={‘column1′:df.column1.mode()[0],’column2′:df.column2.mean(),’column3’:df.column3.median()})

前向填充:df.fillna(method=’ffill’)

后向填充:df.fillna(method=’bfill’)

插值填充:df.column_name.interpolate(method)method=’linear’,’polynomial’多项式,order=2设置最高项次数

3)异常值处理

异常值的识别:xbar=df.column_name.mean()

xstd=df.column_name.std()

any(df.column_name > xbar+3*xstd)

或通过计算分位差识别:

Q1=df.column_name.quantile(q=0.25)

Q3=df.column_name.quantile(q=0.75)

分位差IQR=Q3-Q1

any(df.column_name > Q3+1.5*IQR)

any(df.column_name < Q1-1.5*IQR)

替换异常值:

方法一用不超过上限的最大值进行替换:UL=Q3+1.5*IQR

replace_value=df.column_name[df.column_name < UL].max()

方法二用百分之一和百分之九十九分位数进行替换:P1=df.column_name.quantile(0.01)

P99=df.column_name.quantile(0.99)

df[‘column_new’]=df[‘column_name’]

df.loc[df[‘column_name’] > P99,’column_new’]=P99

df.loc[df[‘column_name’] < P1,’column_new’]=P1

4)数据离散化——分箱(等频或等宽)

等宽分段(易受异常值影响):df[‘a’]=pd. cut(df[‘a’],n,labels=range(1,n+1))分n段

等频分段:方法一根据百分位数划分

k=n

w=[i/k for i in range(k+1)]

pd. qcut(df[‘a’],w,labels=range(0,4))

方法二根据百分位数的具体数值划分

k=n

w=df[‘a’].quantile([i/k for i in range(k+1)])

pd. cut(df[‘a’],w,labels=range(0,n+1))

Original: https://blog.csdn.net/m0_58444622/article/details/124123891
Author: 我就是美玉
Title: Pandas学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/738153/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球