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/
转载文章受原作者版权保护。转载请注明原作者出处!