![《Python程序設計基礎(第2版)》課件 08Pandas數(shù)據(jù)分析庫_第1頁](http://file4.renrendoc.com/view14/M0A/2E/0D/wKhkGWZ5RNKAEStmAAEeii_5UQk885.jpg)
![《Python程序設計基礎(第2版)》課件 08Pandas數(shù)據(jù)分析庫_第2頁](http://file4.renrendoc.com/view14/M0A/2E/0D/wKhkGWZ5RNKAEStmAAEeii_5UQk8852.jpg)
![《Python程序設計基礎(第2版)》課件 08Pandas數(shù)據(jù)分析庫_第3頁](http://file4.renrendoc.com/view14/M0A/2E/0D/wKhkGWZ5RNKAEStmAAEeii_5UQk8853.jpg)
![《Python程序設計基礎(第2版)》課件 08Pandas數(shù)據(jù)分析庫_第4頁](http://file4.renrendoc.com/view14/M0A/2E/0D/wKhkGWZ5RNKAEStmAAEeii_5UQk8854.jpg)
![《Python程序設計基礎(第2版)》課件 08Pandas數(shù)據(jù)分析庫_第5頁](http://file4.renrendoc.com/view14/M0A/2E/0D/wKhkGWZ5RNKAEStmAAEeii_5UQk8855.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Python程序設計基礎第8章Pandas數(shù)據(jù)分析庫教師:XXX第8章Pandas數(shù)據(jù)分析庫8.1Pandas的基本數(shù)據(jù)結構8.2訪問數(shù)據(jù)8.3算術運算和對齊8.4讀/寫數(shù)據(jù)文件8.5數(shù)據(jù)整理8.6分組統(tǒng)計8.7時間序列8.8實例應用第8章Pandas數(shù)據(jù)分析庫概述:Pandas是目前Python生態(tài)圈最常用的數(shù)據(jù)分析工具庫。該庫以NumPy為基礎,增加了標簽支持,整合了對數(shù)據(jù)集的讀取、清洗、轉(zhuǎn)換、分析、統(tǒng)計、繪圖等一系列工作流程,能夠高效地處理和分析結構化表格數(shù)據(jù)。Pandas的名稱來自于面板數(shù)據(jù)(paneldata)和python數(shù)據(jù)分析(dataanalysis)。Pandas適合處理數(shù)值和字符串混雜數(shù)據(jù),numpy適合處理統(tǒng)一的數(shù)值數(shù)據(jù)。安裝
pipinstallpandas#
anaconda中無需再安裝引入pandas的慣例importnumpyasnpimportpandasaspdfrompandasimportDataFrame,Series1.官網(wǎng)/2.推薦書《利用Python進行數(shù)據(jù)分析》中文第2版和英文第3版,書的作者WesMcKinney就是Pandas庫的設計者。
8.1Pandas的基本數(shù)據(jù)結構Pandas提供了兩種基本數(shù)據(jù)結構Series:帶行標簽的一列數(shù)據(jù)DataFrame:帶行、列標簽的二維表格數(shù)據(jù)與NumPy數(shù)組相比,Pandas最重要的改進是增加了標簽(也稱軸索引),可以實現(xiàn)標簽自動對齊運算。importpandasaspdfrompandasimportDataFrame,Seriespd.__version__ #版本2.2.2(2024.4發(fā)布)8.1.1Series序列#有一月和二月的產(chǎn)品生產(chǎn)情況如下,需要按產(chǎn)品合并計算m1={'a':30,'b':40,'c':34}#一月生產(chǎn)'a','b','c'三種產(chǎn)品m2={'a':32,'c':25,'d':50}#二月生產(chǎn)'a','c','d'三種產(chǎn)品s1=Series(m1) #將字典對象轉(zhuǎn)為Series對象s2=Series(m2)第8章Pandas數(shù)據(jù)分析庫p1=s1+s2 #標簽自動對齊,不匹配的為NaNp2=s1.add(s2,fill_value=0) #另一方的缺失值視為0Series具有標簽,運算時自動對齊標簽進行計算,這是Pandas相比NumPy的重要改進。執(zhí)行s1+s2時,兩者都有的'a'、'c'標簽自動對齊,對應的數(shù)值相加;兩者互不匹配的'b'、'd'標簽相加后的值為NaN。NaN(notanumber)是Pandas中表示非數(shù)值或缺失值的符號。8.1Pandas的基本數(shù)據(jù)結構s1=Series([10,20,30])#默認用整數(shù)序號做標簽s2=Series([10,20,30],index=['a','b','c'])#創(chuàng)建時指定標簽s2['a'] #按標簽訪問,10s2[0] #按整數(shù)下標亦可訪問,10s2['a':'c']#標簽切片,含末尾,3個數(shù)據(jù)#整數(shù)索引切片,不含末尾,2個數(shù)據(jù)s2[0:2]Out:a10b20#求和,均值,中位數(shù)s2.sum(),s2.mean(),s2.median()s2['a']=100#修改'a'標簽對應的值s2['d']=200#通過賦值創(chuàng)建新標簽dOut:a100b20c30d2008.1Pandas的基本數(shù)據(jù)結構series對象具有values和index屬性s2.values
#該屬性實際上對應np數(shù)組Out:array([100,20,30,200],dtype=int64)s2.index#索引(即標簽)Out:Index(['a','b','c','d'],dtype='object')s2.index[0]='d' #將報錯,標簽不能單個修改s2.index=['d','e','f','d'] #但允許對標簽一次性全部賦值修改,標簽可重復8.1Pandas的基本數(shù)據(jù)結構表8.1Series對象s的常用屬性和方法s=Series([0,1,1,3,3,3,np.nan,np.nan])#構造Series,含2個np.nans.size,s.count() #共8個數(shù)據(jù),有6個非空數(shù)據(jù),(8,6)s.unique()
#返回不重復的數(shù)據(jù)值array([0.,1.,3.,nan])s.value_counts()
#統(tǒng)計每個數(shù)據(jù)的頻次s.head(2) #顯示頭2行數(shù)據(jù)s.take([1,3,5]) #取索引1,3,5的數(shù)據(jù)屬性或方法名功能描述s.size返回數(shù)據(jù)個數(shù)(此為屬性值,不需要括號)s.count()返回非空數(shù)據(jù)的個數(shù)s.unique()返回不重復的數(shù)據(jù)值s.nunique()返回不重復數(shù)據(jù)值的個數(shù)s.value_counts()統(tǒng)計每個數(shù)據(jù)值的出現(xiàn)次數(shù)s.head(n)只顯示頭部的n個數(shù)據(jù)s.tail(n)只顯示尾部的n個數(shù)據(jù)s.take([i1,i2,…])按指定的索引下標取數(shù)據(jù)8.1Pandas的基本數(shù)據(jù)結構8.1.2數(shù)據(jù)框(DataFrame)DataFrame(數(shù)據(jù)框)是Pandas最重要的數(shù)據(jù)結構。數(shù)據(jù)框可視為由行和列構成的二維表格,單行或單列都可視為一個Series。DataFrame既有行索引(index)又有列索引(columns)。data={'apple':[1100,1050,1200],'huawei':[1250,1300,1328],'oppo':[800,850,750]}df=DataFrame(data,index=['一月','二月','三月']) #index行標簽df['apple'] #訪問一列,訪問兩列df[['apple','oppo']]df.loc['一月'] #訪問一行,不能寫為df['一月']df.loc['一月','apple'] #[行標簽,列標簽]11008.1Pandas的基本數(shù)據(jù)結構數(shù)據(jù)框保存為csv文件df.to_csv('data/mobile.csv',encoding='GBK')
#GBK中文編碼#csv是逗號分隔的數(shù)據(jù)文件!typedata\mobile.csv上例如不指定編碼,Pandas保存csv文件默認使用utf-8編碼。課本第6章文件中提及Python文件編碼默認和操作系統(tǒng)一致,當用!type命令顯示文件內(nèi)容時,Windows系統(tǒng)用GBK編碼解析,中文將顯示為亂碼,所以在涉及中文文件時應視編碼情況指定encoding='GBK'或'utf-8'參數(shù)。#將mobile.csv讀入數(shù)據(jù)框df2,index_col=0指定第0列作為標簽df2=pd.read_csv('data/mobile.csv',index_col=0,encoding='GBK')8.1Pandas的基本數(shù)據(jù)結構#使用嵌套字典創(chuàng)建df,外層字典的鍵作為列名,內(nèi)層的鍵作為行索引。df3=DataFrame({'apple':{'一月':1100,'二月':1050,'三月':1200},'huawei':{'一月':1250,'二月':1300,'三月':1328},'oppo':{'一月':800,'二月':850,'三月':750}})數(shù)據(jù)框是二維表格,有index(行)和columns(列)兩個重要屬性。在創(chuàng)建數(shù)據(jù)框時,可以指定index和columns。data=np.array([10,20,15,16,30,np.nan,60,78,20]).reshape(3,3)df=DataFrame(data,index=['A','B','C'],columns=['x1','x2','x3'])df['dept']=['D1','D2','D1'] #添加dept列df['sex']=['F','F','F'] #添加sex列df.index=['a','b','c'] #修改行索引df.columns=['c1','c2','c3','Dept','Gender'] #修改列名8.1Pandas的基本數(shù)據(jù)結構df.describe()#默認只統(tǒng)計數(shù)值列df.describe(include='object')#統(tǒng)計object類型列(即字符列)describe可快速得到數(shù)值列的非空值數(shù)據(jù)個數(shù)count、均值mean、標準差std、最小值min、最大值max,25%、50%、75%數(shù)據(jù)分位點的分位數(shù)等。字符列則統(tǒng)計非空值個數(shù)count、唯一性取值個數(shù)unique、最高頻次數(shù)據(jù)top和最高頻次freq。8.2訪問數(shù)據(jù)數(shù)據(jù)框有多種靈活的訪問形式。() #顯示數(shù)據(jù)概況(列名、數(shù)據(jù)類型)df.head() #顯示頭5行df.tail(2) #顯示末尾2行8.2.1loc[]、iloc[]訪問1.按列或行切片訪問訪問列數(shù)據(jù)時使用object['列名']或object.列名的形式。df['c1']
#訪問c1列,也可寫為df.c1df[['c1','c3']] #c1、c3兩列df[
'a':'b'
] #行索引切片
df[df.c1>10] #按條件訪問,只顯示c1>10的行8.2訪問數(shù)據(jù)2.loc和iloc存取器訪問行或塊數(shù)據(jù)時常用loc[]和iloc[]存取器,loc基于標簽,iloc基于整數(shù)索引下標。loc[]中可以是[單行]、[單行,單列]、[行切片]、[行切片,列切片]等多種表達形式。取出的是Series或DataFrame。格式示例說
明df.loc['a']訪問行標簽'a'對應的一行df.iloc[0]訪問第0行df.loc['a':'c']訪問行標簽'a'到'c',共3行(含結尾)df.iloc[0:2]訪問第0,1行,共2行(不含結尾)df.iloc[[0,2]]訪問第0,2兩行df.iloc[0,2]訪問第0行、第2列處的單個數(shù)據(jù)df.iloc[:,1]訪問第1列df.iloc[:,[0,2]]訪問第0,2兩列數(shù)據(jù)df.iloc[:2,:2]訪問第0~1行和第0~1列交叉處的數(shù)據(jù)塊表8.2loc[]和iloc[]格式示例表8.2訪問數(shù)據(jù)df.loc['a'] df.iloc[0:2]2.loc和iloc存取器loc[]基于標簽而iloc[]基于整數(shù)下標,所以不能出現(xiàn)loc[1]、iloc['a']這樣的寫法。df.loc['a':'b','c1':'c2'] df.loc[:,'c2':'c3']8.2訪問數(shù)據(jù)8.2.2query()和select_dtypes()Pandas支持query()查詢,類似數(shù)據(jù)庫的查詢條件表達,根據(jù)列名條件進行數(shù)據(jù)篩選,返回DataFrame對象。df.query('c1>15') #查詢c1>15df.query('c1>15andc2>30') #查詢c1>15andc2>30查詢的數(shù)據(jù)如需修改,注意下面的語法將彈出“SettingWithCopyWarning”警告信息,無法成功修改。警告信息大意是不能在查詢出的副本上直接修改數(shù)據(jù)。df.query('c1<20')['c1']=20#將顯示警告,無法修改數(shù)據(jù)#按Pandas文檔所述,應采用如下的loc語法才能修改df.loc[df['c1']<20,'c1']=20#將c1列<20的數(shù)都修改為20如果要獲取特定數(shù)據(jù)類型的列,可使用下面的命令。df.select_dtypes('float')#只獲取浮點類型列,即c1,c2,c3列df.select_dtypes('object')#只獲取object類型列,即Dept,Gender列8.3算術運算和對齊8.3.1nan缺失值處理有時原始數(shù)據(jù)中含有缺失值。NumPy用np.nan表示缺失值,Pandas用NaN(NotaNumber)表示缺失值。兩者對nan值的默認處理不同。NumPy運算時若有np.nan則返回nan。Pandas運算時若有np.nan則忽略nan,用其他非nan數(shù)據(jù)進行運算并返回結果。#演示NumPy和Pandas對缺失值nan的處理不同b=np.array([1,5,np.nan,np.nan,10])b.sum(),b.mean() #有nan值時,NumPy運算返回nanOut:(nan,nan)s=Series(b) #生成Series,含有nans.sum(),s.mean() #Series默認忽略nan值,可返回計算結果Out:(16.0,5.333)s.mean(skipna=False)#False表示不能忽略nanOut:nan8.3算術運算和對齊8.3.1nan缺失值處理1.isnull()和notnull()函數(shù):判斷每個值是否是nan值,返回布爾數(shù)組s.isnull().sum()#統(tǒng)計缺失值個數(shù),22.dropna()函數(shù):刪除含nan值的行或列df=pd.DataFrame(np.arange(12).reshape(4,3),index=list('abcd'), columns=list('xyz'))df.iloc[1:3,0:2]=np.nan #特意設置幾個nan值df.iloc[2,2]=np.nan8.3算術運算和對齊8.3.1nan缺失值處理2.dropna()函數(shù):返回刪除nan值后的新數(shù)據(jù)框,原df不變axis=1
按列,含有nan值的列被刪除。默認是axis=0,按行how='all' 表示某行的所有數(shù)據(jù)都為nan才刪除thresh=1
某行非缺失值個數(shù)>=1就保留,否則刪除8.3算術運算和對齊8.3.1nan缺失值處理3.fillna()函數(shù):將nan值用特定的值填充df.fillna(0) #缺失值都用0填充df.fillna(method='ffill') #缺失值用其前面的非nan值填充df.fillna(method='bfill') #缺失值用其后面的非nan值填充df.fillna(value=df.mean()) #各列用平均值填充df.fillna(value={'x':-1,'y':2})#x列缺失值填-1,y列缺失值填28.3算術運算和對齊8.3.2對齊處理Pandas支持標簽訪問數(shù)據(jù),運算時自動基于標簽對齊進行計算。運算數(shù)據(jù)若是Series則只有行標簽,若是DataFrame則會在行、列兩個方向上對齊標簽再計算,標簽不匹配的數(shù)據(jù)元素默認標記為NaN值。df=pd.DataFrame(np.arange(9).reshape(3,3),index=list('abc'),
columns=list('xyz'))s=pd.Series([1,2,3],index=list('xyz'))df+sDataFrame和Series之間的運算默認將Series的行索引匹配到DataFrame的列索引,然后沿著行方向向下廣播計算。8.3算術運算和對齊8.3.2對齊處理上例是按axis=1對齊,下面的例子指定按axis=0方向?qū)R。df=pd.DataFrame(np.arange(9).reshape(3,3),index=list('abc'),
columns=list('xyz'))s=pd.Series([1,2,3],index=list('abc'))#此處如寫df+s返回的都是nandf.add(s,axis=0)#也可寫為axis='index'8.3算術運算和對齊8.3.2對齊處理兩個數(shù)據(jù)框運算時,在行、列索引上都要對齊。df2=pd.DataFrame(np.arange(9,18).reshape(3,3),index=list('abd'), columns=list('wxy'))df+df2df.add(df2,fill_value=0)df和df2在行標簽上只有'a'、'b'匹配,列標簽上只有'x'、'y'匹配,所以df+df2只有對應位置上的4個數(shù)據(jù)值相加,其余位置上都為NaN。結果的行、列標簽是兩個數(shù)據(jù)集標簽的并集。8.3算術運算和對齊8.3.3通用函數(shù)Pandas基于NumPy,所以NumPy的通用函數(shù)都可以在Pandas中使用。df=pd.DataFrame(np.arange(9).reshape(3,3),index=list('abc'),
columns=list('xyz'))df.sum() #默認按axis=0縱向按列求和df.sum(axis=1) #axis=1水平按行求和df.sum().sum() #對所有數(shù)據(jù)求和,和為36df.mean(),df.var() #均值,方差8.3算術運算和對齊8.3.3通用函數(shù)另一類常見的操作是將自定義的函數(shù)應用到各行或各列上,以對整行或整列進行統(tǒng)計。DataFrame的apply()方法可以實現(xiàn)這一功能。#定義函數(shù)f,參數(shù)x代表單列或單行f=lambdax:(x.max(),x.min(),np.ptp(x),x.mean())df2=df.apply(f)#每列均返回4個統(tǒng)計結果df2.index=['最大','最小','極差','均值']df.apply(lambdax:x-x.mean()) #計算每列數(shù)據(jù)與均值的差8.3算術運算和對齊8.3.3通用函數(shù)df.applymap(lambdax:str(x)+'?c')#在每個數(shù)據(jù)上變換apply()方法應用到整行、整列上,數(shù)據(jù)框還有一個applymap()方法應用到單個數(shù)據(jù)上,pandas2.1版將此方法改名為map。下面定義一個匿名函數(shù)lambdax:str(x)+'?c',其中的x代表每個數(shù)據(jù),str(x)將其轉(zhuǎn)換為字符串,然后加上'?c'。8.4讀/寫數(shù)據(jù)文件8.4.1CSV文件CSV文件是以逗號分隔的文本文件,常用作軟件之間數(shù)據(jù)交換的中間文件。Pandas提供read_csv()和to_csv()兩個方法讀/寫CSV文件。假定有mobile.csv文件(該文件已在8.1.2節(jié)創(chuàng)建),內(nèi)容如下:,apple,huawei,oppo一月,1100,1250,800二月,1050,1300,850三月,1200,1328,750df=pd.read_csv("data/mobile.csv",encoding='GBK',index_col=0)文件mobile.csv中含有中文,當初保存時選了GBK編碼字符集,所以讀取時也應指定該編碼集。如不指定,Pandas默認將按utf-8編碼讀取,就會產(chǎn)生如下的'utf-8'解析錯誤。UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xd4inposition2:invalidcontinuationbyteindex_col=0指定將文件的第0列作為索引標簽。mobile.csv文件的第0行會被自動解析為列名。8.4讀/寫數(shù)據(jù)文件8.4.1讀/寫CSV文件數(shù)據(jù)文件m2.csv的內(nèi)容如下。該文件只含數(shù)據(jù),不含列名和標簽,讀取時可用names參數(shù)自行指定列名。1100,1250,8001050,1300,8501200,1328,750df2=pd.read_csv("data/m2.csv",names=['apple','huawei','oppo'])#也可以第一步先讀取
df3=pd.read_csv("data/m2.csv",header=None)#第二步再修改columns和indexdf3.columns=['apple','huawei','oppo']df3.index=['一月','二月','三月']header=None表示文件不含列名。若不指定這個參數(shù),則文件第0行“1100,1250,800”將被錯誤解析為列名。8.4讀/寫數(shù)據(jù)文件8.4.1讀/寫CSV文件有些文件不是用逗號分隔,而是用空格分隔。文件m4.txt內(nèi)容如下:110012508001050130085012001328750df4=pd.read_csv("data/m4.txt",sep="\s+",header=None)m4.txt文件各個數(shù)據(jù)用數(shù)量不等的空格或制表鍵分隔,所以指定sep="\s+"參數(shù)。"\s+"是正則表達式,表示分隔符可為若干空白字符。#跳過前2行pd.read_csv("數(shù)據(jù)文件名",skiprows=2,sep='\s+',encoding='cp936')pd.read_csv("數(shù)據(jù)文件名",skiprows=[0,2]) #跳過第0,2行pd.read_csv("數(shù)據(jù)文件名",skipfooter=2,engine='python')#跳過尾部的2行pd.read_csv("數(shù)據(jù)文件名",nrows=10) #只讀取前10行數(shù)據(jù)8.4讀/寫數(shù)據(jù)文件8.4.1讀/寫CSV文件文件中如包含日期數(shù)據(jù),可以用parse_dates參數(shù)指定按日期解析。stock.txt內(nèi)容如下:交易日 開盤 最高最低收盤成交量
2019/03/22 18.09 18.63 18.02 18.15 43760812 2019/03/23 18.16 18.35 18.06 18.13 278307962019/03/24 18.11 18.11 17.68 17.72 27448272df=pd.read_csv('data/stock.txt',parse_dates=['交易日'], encoding='GBK',sep='\s+',index_col='交易日')解析后的df.index是日期類,便于以后按日期段查詢統(tǒng)計。df.index#顯示索引為日期類dtype=datetime64[ns]數(shù)據(jù)框?qū)ο缶哂衪o_csv()方法,可將數(shù)據(jù)存入CSV文件。df.to_csv("d1.csv",encoding='GBK') #存盤,默認逗號分隔df.to_csv("d2.txt",encoding='GBK',sep='')#用空格分隔8.4讀/寫數(shù)據(jù)文件8.4.2讀/寫Excel文件Pandas提供了兩個方法read_excel()和to_excel()讀/寫電子表格。#將數(shù)據(jù)框保存到Excel文件df1.to_excel("tmp/a1.xlsx")#默認讀第1個工作表,第1行作為列名,A列(第0列)作為標簽df1=pd.read_excel("data/mobile.xlsx",index_col=0)#讀Excel文件#sheet_name指定讀某個工作表df2=pd.read_excel("data/mobile.xlsx",sheet_name='二季度')可以將多個數(shù)據(jù)框保存到一個Excel文件的不同工作表中。如下語句執(zhí)行后,df1和df2的數(shù)據(jù)分別保存在test.xlsx內(nèi)名為"一季度"和"二季度"的工作表中。withpd.ExcelWriter("tmp/test.xlsx")aswriter:df1.to_excel(writer,sheet_name='一季度')df2.to_excel(writer,sheet_name='二季度')8.4讀/寫數(shù)據(jù)文件8.4.3Stata和Json文件Stata是一種常用的統(tǒng)計分析軟件,其數(shù)據(jù)文件擴展名為.dta。Pandas支持讀寫Stata文件。Json是一種輕量級數(shù)據(jù)文本文件,內(nèi)部格式類似字典。很多動態(tài)網(wǎng)頁數(shù)據(jù)刷新時從服務器返回的就是json文件。Pandas支持讀寫json文件。df1.to_json('tmp/test.json',force_ascii=False)#保存為json文件df=pd.read_json('tmp/test.json')#讀json文件#保存,數(shù)據(jù)如含中文需指定version參數(shù)df1.to_stata('tmp/test.dta',version=119)#讀出.dta文件可使用下面的命令sta=pd.read_stata('tmp/test.dta',index_col='index')8.4讀/寫數(shù)據(jù)文件8.4.4html表格pd.read_html可讀取網(wǎng)頁中的表格,該方法僅適合用html的<table>標簽組織的數(shù)據(jù)。每個table轉(zhuǎn)為一個數(shù)據(jù)框,返回一個由數(shù)據(jù)框構成的列表。#此處htmlfile是本地頁面,可替換為一個網(wǎng)址htmlfile='data/2023年最新軟科中國大學排名_中國最好大學排名.html'lst=pd.read_html(htmlfile,encoding='utf-8')#該網(wǎng)頁僅含一個table表df=lst[0]#列表的第0項,一個數(shù)據(jù)框?qū)ο骴f=df.iloc[:,:5]#只保留前5列df.columns=['排名','學校名稱','省市','類型','總分']#改列名df['中文名']=df['學校名稱'].str.split().str[0]#中文名是分解后的第0項#英文名是[1:-1]中的所有項,.join連接df['英文名']=df['學校名稱'].str.split().str[1:-1].str.join(sep='')df['層次']=df['學校名稱'].str.split().str[-1]#層次是分解后的最后一項df.to_excel('tmp/2023大學排行榜.xlsx',index=False)print(df[['排名','中文名','省市','類型','總分','層次']].head(3))8.5數(shù)據(jù)整理表8.3Pandas提供的數(shù)據(jù)整理方法方
法
名功能描述df.drop(行標簽)返回刪除行后的新數(shù)據(jù)框,原數(shù)據(jù)框不變df.drop(列名,axis=1)返回刪除列后的新數(shù)據(jù)框,原數(shù)據(jù)框不變df.pop(列名)刪除并返回某列,直接改變原數(shù)據(jù)框df.insert(新列位置,列名,列值)插入新列,直接改變原數(shù)據(jù)框df.reindex(標簽列表)重索引(只保留指定的標簽),原數(shù)據(jù)框不變df.reset_index()將索引列變?yōu)閿?shù)據(jù)列df.set_index(列名)將數(shù)據(jù)列變?yōu)樗饕衐f.rename()更改行標簽或列名df.duplicated()檢測重復值,返回布爾數(shù)組df.drop_duplicates()刪除重復值pd.concat((df1,df2))合并數(shù)據(jù)框?qū)?shù)據(jù)集做插入/刪除/合并/排序/重索引/檢測重復數(shù)據(jù)等操作。8.5數(shù)據(jù)整理8.5.1行、列的插入和刪除df=DataFrame({'姓名':['a','b'],'學號':['A1','A2'],'成績1':[98,90],'成績2':[87,80]})1.行的插入/刪除#要在數(shù)據(jù)框末尾插入一行,可使用loc語法給新行賦值即可df.loc[2]=['d','A4',89,78]#新行的行標簽為2刪除行使用drop()方法。DataFrame的大多數(shù)命令并不直接改變原數(shù)據(jù)框,而是返回新數(shù)據(jù)框。要直接修改原數(shù)據(jù)框時,可將命令寫為df=df.drop(2)的形式,或在命令中指定inplace=True參數(shù)newdf=df.drop(2)#按索引刪除第2行,返回新框,原df不變df.drop(2,
inplace=True)#刪除索引2的行,inplace=True修改原數(shù)據(jù)框8.5數(shù)據(jù)整理8.5.1行、列的插入和刪除2.列的插入/刪除給新列賦值是創(chuàng)建新列最簡單的方法,新列默認插在最后。要注意提供的數(shù)據(jù)個數(shù)應等于數(shù)據(jù)框的行數(shù)。df['性別']=['M','F']#增加"性別"列,給新列賦值即可插入列#在第4列插入平均成績,插入值由成績1和成績2計算得到df.insert(4,'平均成績',(df.成績1+df.成績2)/2)Out:
姓名學號成績1成績2平均成績性別0a A198 87 92.5M1b A290 80 85.0F刪除列時,可使用如下三種方法。注意axis=1和inplace參數(shù)df.drop('平均成績',axis=1,inplace=True)df.pop('成績1')deldf['成績2']8.5數(shù)據(jù)整理8.5.2索引整理1.reindex()重建索引通過reindex()方法重建索引,可實現(xiàn)行列的取舍。重建時保留指定標簽的數(shù)據(jù),拋棄未指定的標簽。df=pd.read_csv("data/mobile.csv",encoding='GBK',index_col=0)df2=df.reindex(['一月','二月','四月'])上例中新數(shù)據(jù)框df2只保留了一月和二月的數(shù)據(jù),丟棄了三月的數(shù)據(jù),同時建立了一個'四月'新標簽,新標簽對應的值默認為NaN。df.reindex(['apple','huawei','mi'],axis=1)#axis=1在列上重建索引8.5數(shù)據(jù)整理8.5.2索引整理2.rename()重命名如果已有的列名或行索引不太合適,可使用rename()進行調(diào)整。df.rename(columns={'apple':'Apple','huawei':'HW'})#改列名Out: AppleHWoppo一月11001250800二月10501300850三月12001328750df.rename(index={'二月':'February','三月':'March'})#改行標簽Out: applehuaweioppom1 11001250800February10501300850March 120013287508.5數(shù)據(jù)整理8.5.2索引整理3.set_index()重新設定索引列如果想用另一列做索引列,可用set_index()方法變更。df=DataFrame({'姓名':['a','b'],'學號':['A1','A2'],'成績1':[98,90],'成績2':[87,80]})df3=df.set_index('學號')#返回的新數(shù)據(jù)框?qū)W號列設為索引df3.reset_index(inplace=True)#先將原索引列學號恢復為數(shù)據(jù)列df3.set_index('姓名',inplace=True)#再將姓名列設為索引列8.5數(shù)據(jù)整理8.5.3重復值處理數(shù)據(jù)中含有重復值時,使用下列方法處理。s=Series(list('abac'))s.duplicated() #檢測重復值,返回布爾數(shù)組,重復值處顯示Trues.drop_duplicates()
#刪除重復值df=DataFrame({'c1':['a','a','b'],'c2':['a','b','b'],'c3':['a','b','x']})df.drop_duplicates('c1')#c1列上刪除重復值8.5數(shù)據(jù)整理8.5.4排序和排名1.排序排序可按索引或數(shù)據(jù)值。按索引排序使用sort_index()方法,按數(shù)據(jù)值排序使用sort_values()方法。排序后返回新的有序集,不改變原數(shù)據(jù)集。s=Series([2,5,1],index=['d','a','b'])s.sort_index()#按索引'abd'排序,返回新對象,并不改變原對象s.sort_values()#按數(shù)據(jù)值125排序s.sort_index(ascending=False) #按索引逆序從大到小排8.5數(shù)據(jù)整理8.5.4排序和排名1.排序?qū)?shù)據(jù)框排序時,可以設定axis參數(shù)以指定按行或按列排序。注:無論升序降序,缺失值都排在末尾np.random.seed(7) arr=np.array(np.random.randint(1,100,size=9)).reshape(3,3)df=DataFrame(arr.reshape(3,3),columns=['x','y','z'],index=['a','b','c'])df.sort_index(axis=1,ascending=False)#按列名索引降序zyx排列df.sort_values(by='y') #按y列的數(shù)值排序df.sort_values(by=['y','z']) #先參照y列,再z列排序8.5數(shù)據(jù)整理8.5.4排序和排名2.排名排名rank()和排序類似,但會自動生成一個排名號。s=Series([3,5,8,5],index=list('abcd')) s.rank()
#排名,默認按數(shù)據(jù)值升序排名pd.concat((s,s.rank()),axis=1)#將s和其排名合并s.rank(method='first')
#指定名次號的生成方法為first上例中索引a的數(shù)值最小,排第1。索引b,d的數(shù)值相同,應排在第2、3名,取平均名次(2+3)/2=2.5,索引c排在第4。method='first'表示排名相同時不計算平均名次,而是以數(shù)據(jù)出現(xiàn)的先后順序排列。
8.5數(shù)據(jù)整理8.5.5數(shù)據(jù)框連接Pandas提供了merge()方法用于連接不同數(shù)據(jù)框的行,類似于數(shù)據(jù)庫的SQL等值連接查詢。df1和df2有同名列color,pd.merge()自動將同名列作為連接鍵,橫向連接兩個數(shù)據(jù)框的color值相等的行。連接時丟棄原數(shù)據(jù)框的索引。
df1=DataFrame({'color':['r','b','w','w'],'c1':range(4)})df2=DataFrame({'color':['b','w','b'],'c2':range(2,5)})pd.merge(df1,df2)#或?qū)憺閜d.merge(df1,df2,on='color') 8.5數(shù)據(jù)整理8.5.5數(shù)據(jù)框連接兩個數(shù)據(jù)框列名不同時,用left_on和right_on參數(shù)分別指定。下例指定c1,c2列為鍵,表示當df1表的c1列值等于df2表的c2列值時滿足連接條件。pd.merge(df1,df2,left_on='c1',right_on='c2')上例因為兩個表的color列名相同,所以自動加上后綴_x,_y區(qū)分。pd.merge默認做inner內(nèi)連接,還可指定left
/right/outer等連接方式,這些連接方式與數(shù)據(jù)庫中的連接規(guī)則是類似的。df2=DataFrame({'color':['b','w','g'],'c2':range(2,5)})pd.merge(df1,df2,how='left') #包含左表所有的行,左外連接pd.merge(df1,df2,how='right') #包含右表所有的行,右外連接pd.merge(df1,df2,how='outer') #包含兩表所有的行,全外連接8.5數(shù)據(jù)整理8.5.5數(shù)據(jù)框連接與連接有關的另一個方法是pd.concat(),它合并兩個數(shù)據(jù)框。np.random.seed(7)df1=DataFrame(np.random.rand(4).reshape(2,2),columns=['c1','c2'])df2=DataFrame(np.random.rand(4).reshape(2,2),columns=['c1','c2'])pd.concat([df1,df2]) #默認沿縱向合并,行數(shù)增加pd.concat([df1,df2],axis=1)
#axis=1沿橫向合并,列數(shù)增加8.5數(shù)據(jù)整理8.5.6數(shù)據(jù)分箱數(shù)據(jù)分箱是將數(shù)據(jù)劃分到指定的區(qū)間段,以統(tǒng)計每個區(qū)間的數(shù)據(jù)個數(shù)。例如將成績分為優(yōu)、良、中、不及格區(qū)間段。分箱的方法是pd.cut(),分箱前要自定義數(shù)據(jù)區(qū)間段,并設置對應的標識文字。np.random.seed(7)score=np.random.randint(30,100,size=100) #生成100個隨機整數(shù)bins=[0,59,70,85,100]
#定義區(qū)間段,右閉區(qū)間labels=['不及格','中','良','優(yōu)']
#設置各段的標識文字scut=pd.cut(score,bins,labels=labels)
#將score按bins分段s=scut.value_counts() #統(tǒng)計各類別的數(shù)據(jù)個數(shù)#劃分區(qū)間為(0,59]<(59,70]<(70,85]<(85,100]8.5數(shù)據(jù)整理8.5.6數(shù)據(jù)箱還可采用下面兩種分箱模式。#qcut按分位數(shù)等分為4個區(qū)段,每段數(shù)據(jù)量大致相同qcut=pd.qcut(score,4)qcut.value_counts()dcut=pd.cut(score,5)
#分為5個等深的區(qū)間段dut.value_counts() #統(tǒng)計各類別的數(shù)據(jù)個數(shù)8.5數(shù)據(jù)整理8.5.7多級索引Pandas支持一級索引,也支持多級索引(MultiIndex)。多級索引可以更好地表達數(shù)據(jù)之間的聯(lián)系。假定A、B兩類產(chǎn)品都有紅、綠兩種顏色。上圖中df有兩級索引(0級和1級),索引分別命名為product和color。df.loc['B'] #B類產(chǎn)品df.loc[('B','r')] #B類中的紅色r產(chǎn)品df.loc[(slice(None),'r'),:] #所有的紅色r產(chǎn)品,注意這種特殊的表示方法df.xs('r',level='color')#紅色r產(chǎn)品#創(chuàng)建多級索引mindex=pd.Index([('A','r'),('A','g'),('B','r'),('B','g')],name=('product','color'))#利用多級索引創(chuàng)建數(shù)據(jù)框df=DataFrame(np.arange(2,10).reshape(4,2),index=mindex,columns=['一月','二月'])8.5數(shù)據(jù)整理8.5.7多級索引df.loc['A'].sum() #A類每個月數(shù)量和df.loc['A'].sum().sum() #所有A類數(shù)量和df.loc[(slice(None),'r'),:].sum().sum() #r類數(shù)量和df.groupby(level='product').sum()df.groupby(level='product').sum().sum(axis=1)多級索引便于按索引統(tǒng)計,如下所示。8.5數(shù)據(jù)整理8.5.7多級索引多級索引數(shù)據(jù)框常使用stack()和unstack()命令進行行索引和列索引的轉(zhuǎn)換。df2=df.unstack()#默認將最內(nèi)層的1級行索引轉(zhuǎn)為列索引df2.columnsdf3=df.stack()#列索引轉(zhuǎn)為行索引,行索引變?yōu)槿?0,1,2)df3.groupby(level=2).sum()8.5數(shù)據(jù)整理8.5.8矢量化字符串處理Pandas為字符串提供了形如“列.str.方法()”的矢量化命令支持,這些方法一般在數(shù)據(jù)清洗、轉(zhuǎn)換時使用,如8.4.4節(jié)所示。s=Series(['BeautyandtheBeast','CaptainAmerica:CivilWar','JurassicWorld','ToyStory'])help(s.str) #顯示s.str幫助s.str.len() #返回字符串長度s.str.split() #分割字符串s.str.strip() #去除首尾的空白字符s.str[:6] #字符串切片s.str.contains('War') #測試電影名中是否包含Wars.str.lower().str.contains('war') #轉(zhuǎn)小寫再測是否含wars.str.replace('','-') #字符替換,用橫線-替換空格8.6分組統(tǒng)計8.6.1分組對象概述(重點)Pandas支持數(shù)據(jù)分組,功能類似數(shù)據(jù)庫中的groupby(分組統(tǒng)計)。g是一個DataFrameGroupBy對象,它實際上還沒有進行任何分組統(tǒng)計,僅含有一些分組如何劃分的關鍵信息。分組鍵有多種形式:某個列或列的組合。列表或數(shù)組,其長度與待分組的軸?樣字典或Series,給出待分組軸上的值與分組名之間的對應關系。函數(shù),用于處理數(shù)據(jù)或標簽。參考:《利用Python進行數(shù)據(jù)分析》中文第二版第10章groupby()中可設置as_index=False參數(shù)表示分組值不作為行索引,而作為數(shù)據(jù)列df=pd.DataFrame({'color':['red','white','black','red','black','red'],'size':['s','m','b','s','m','b'],'price':[10,11,12,20,21,22],'quantity':[1,2,3,3,4,5]})g=df.groupby('color')#按color分組8.6分組統(tǒng)計表8.4Pandas分組對象g的屬性和方法分組對象的屬性和方法描
述g.ngroups分組數(shù)屬性g.size()列出每個分組所含的數(shù)據(jù)行數(shù)g.sum(),g.mean(),g.std()對每組求和、均值、標準差g.groups列出每個分組包含的數(shù)據(jù)索引編號g.head(n),g.nth(n)列出分組的前n個數(shù)據(jù),第n個數(shù)據(jù)g.describe()對分組進行統(tǒng)計,返回一組常用統(tǒng)計量g.agg([函數(shù)1,函數(shù)2])對分組數(shù)據(jù)按指定函數(shù)進行統(tǒng)計g.ngroups #ngroups分組數(shù)g.groups #列出每個分組包含的數(shù)據(jù)索引編號forname,grouping:print(name) #輸出組名print(group) #組內(nèi)容8.6分組統(tǒng)計8.6.2分組對象的統(tǒng)計方法g.size() #列出每個分組的數(shù)據(jù)條數(shù)g.sum(numeric_only=True)#只對數(shù)值列求和g.get_group('black') #指定返回black組數(shù)據(jù)g.head(2) #取每個分組的頭2條數(shù)據(jù)g.nth(0) #取每組的第0條數(shù)據(jù)g.price.describe() #對price列做describe,得到一組常用統(tǒng)計量8.6分組統(tǒng)計8.6.2分組對象的統(tǒng)計方法分組對象有一個agg聚合方法,它允許傳遞多個統(tǒng)計函數(shù),因此可以一次性得到多個統(tǒng)計值。#對quantity列求和、均值、最大值、最小值g.quantity.agg((np.sum,np.mean,np.max,np.min))g.quantity.agg([('均值','mean'),('最大值','max')]) #定義列名8.6分組統(tǒng)計8.6.3數(shù)據(jù)透視表和交叉表Excel中有一個數(shù)據(jù)透視表功能,Pandas提供了類似的命令pivot_table()。上面的命令按color先分大組,再按size分小組,對quantity列求和。margins=True表示加上分項小計ALL。df=pd.DataFrame({'color':['red','white','black','red','black','red'],'size':
['s','m','b','s','m','b'],'price':[10,11,12,20,21,22],'quantity':[1,2,3,3,4,5]})df.pivot_table(index='color',columns='size',values='quantity',aggfunc='sum',margins=True)8.6分組統(tǒng)計交叉表(cross-tabulation,簡稱crosstab)是?種?于計算分組頻次的特殊透視表。參數(shù)中index指定分組索引,columns指定列名。統(tǒng)計每類數(shù)據(jù)的頻次。#normalize計算所占百分比,'all'按總數(shù),'index'按每行,'columns'按每列pd.crosstab(index=df['color'],columns=df['size'],normalize='all')pd.crosstab(index=df['color'],columns=df['size'])補充:1.啞元轉(zhuǎn)換2.LabelEncoder
df=pd.DataFrame(={'dept':['a','b','c'],'id':[0,1,2],'age':[19,20,18]})#2.將字符串編碼為整數(shù)序號fromsklearn.preprocessingimportLabelEncoderdf['x']=
LabelEncoder().fit_transform(df['dept'])df.head()#1.啞元轉(zhuǎn)換:將字符類型的列dept轉(zhuǎn)獨熱編碼onehot,統(tǒng)計學中常見pd.get_dummies(df)補充:pivot():長轉(zhuǎn)寬,melt():寬轉(zhuǎn)長importrandomrandom.seed(7)lst=[]forxin'ABC':foryin'xyz':lst.append((x,y,random.randint(0,10)))df=DataFrame(data=lst,columns=['c1','c2','value']) #df原本是長格式df2=df.pivot(index='c1',columns='c2',values='value') #長格式轉(zhuǎn)寬格式df3=df2.reset_index()#先將原索引列轉(zhuǎn)為數(shù)據(jù)列df4=df3.melt(id_vars=['c1'],value_vars=['x','y','z'],var_name=['c2'],value_name='value')#寬轉(zhuǎn)長melt命令中,id_vars參數(shù)對應數(shù)據(jù)集中不需要轉(zhuǎn)換的列,value_vars參數(shù)對應需要轉(zhuǎn)換的列,var_name是轉(zhuǎn)換后的類型列的新列名,value_name是轉(zhuǎn)換后數(shù)值列的新列名。8.7時間序列8.7.1Pandas中的時間函數(shù)Pandas最初研發(fā)的目的是作為金融數(shù)據(jù)分析包,因此提供了豐富的時間序列處理方法。時間序列做索引,運算時會自動按日期對齊。python自帶的datetime和time庫參考教材第2章。1.to_datetime():將字符串轉(zhuǎn)換為時間,識別不同格式的日期字符串。pd.to_datetime('2023-2-20') #年-月-日Out:Timestamp('2023-02-2000:00:00')#'mixed'表示多種格式均可識別,pd2.1版需此參數(shù)。低版本pd不要設此參數(shù)pd.to_datetime(['2/20/2023','2023.2.20'],format='mixed') Out:DatetimeIndex(['2023-02-20','2023-02-20'],dtype='datetime64[ns]')importdatetimetoday=datetime.datetime.now() #生成今天的日期today+pd.DateOffset(days=3) #后推3天today+pd.DateOffset(years=1,months=6) #后推1年6個月8.7時間序列8.7.1Pandas中的時間函數(shù)如下數(shù)據(jù)框索引類型初始不是日期類型,可用to_datetime()方法將其轉(zhuǎn)換為日期類型,以便于后續(xù)按日期段處理。Out:Index(['2019-1-1','2019-1-5','2019-1-10'],dtype='object')df=DataFrame(np.arange(2,5),index=['2019-1-1','2019-1-5','2019-1-10'],columns=['A'])df.index#初始索引的數(shù)據(jù)類型是object,不是日期型Out:DatetimeIndex(['2019-01-01','2019-01-05','2019-01-10'],dtype='datetime64[ns]',freq=None)#將索引的數(shù)據(jù)類型轉(zhuǎn)為日期型df.index=pd.to_datetime(df.index)df.index8.7時間序列8.7.1Pandas中的時間函數(shù)2.date_range():用于產(chǎn)生指定日期段內(nèi)的一系列日期時間值。pd.date_range(起始日期,結束日期,periods=周期數(shù),freq=日期頻率)表8.5date_range函數(shù)的常用freq參數(shù)表pd.date_range('2019-02-01','2019-02-28') #默認頻率1天pd.date_range('2019-02-01','2019-02-28',freq='3D')#頻率為每3天pd.date_range('2019-01-02',periods=5,freq='B') #5個商業(yè)日參數(shù)名含
義H時T分S秒L毫秒D日歷日(即每天,此為默認值)B商業(yè)日(只含周一至周五,不含周六、日)W周M月底(如1月31日,2月28日,6月30日)MS月初(如1月1日,2月1日,6月1日)Q季末(如3月31日,6月30日)8.7.1Pandas中的時間函數(shù)有時需要對日期序列做shift(移動)轉(zhuǎn)換,以計算相鄰日期間的數(shù)據(jù)變動。data=[10,11,10.8,10.2,10.5]#從9月1日開始返回5天,B表示商業(yè)日,不含周六、日dateindex=pd.date_range('2023-9-1',periods=5,freq='B')price=Series(data,index=dateindex)price.shift(1) #后移一個數(shù)據(jù)位price-price.shift(1)#運算時日期對齊,計算相鄰兩天的價格差(price-price.shift(1))/price.shift(1)#變動百分比8.7時間序列8.7.2時間頻率變換用時間作為索引時,可以方便地按時間段切片查看數(shù)據(jù)。np.random.seed(7)dates=pd.date_range('2023-1-1',periods=365)s=Series(np.random.randn(365),index=dates)#2023年模擬數(shù)據(jù)s['2023-1'] #選取2023年1月的數(shù)據(jù)s['2023-02':'2023-04'] #選取2023-2月至4月的數(shù)據(jù)s[:'2023-03'] #2023-3-31日之前的數(shù)據(jù)
8.7時間序列8.7.2時間頻率變換對時間序列數(shù)據(jù)可用resample()方法按不同頻率進行重采樣,然后對樣本進行聚合計算。將?頻數(shù)據(jù)聚合到低頻稱為降采樣(downsampling),將低頻數(shù)據(jù)轉(zhuǎn)換到?頻則稱為升采樣(upsampling)。s.resample("1M").mean()#按月求均值,降采樣s.resample('1M').ohlc() #返回每月的:開盤/最高/最低/收盤價
s.resample("10D").sum()#每10天求和#每10天一次采樣,返回每組樣本的最大值、最小值s.resample("10D").agg([np.max,np.min])s.resample('12H').ffill()#升采樣,將每天的數(shù)據(jù)升頻為每12小時,前向填充8.7時間序列8.7.3rolling滑動窗口金融數(shù)據(jù)處理時經(jīng)常需要計算x日股票均價,可使用rolling滑動窗口函數(shù)。例如有一組數(shù)據(jù),如設定rolling(3),則每個數(shù)據(jù)和其前面的2個數(shù)據(jù)構成一個觀察窗口,同一窗口內(nèi)的數(shù)據(jù)可做各類常規(guī)統(tǒng)計。計算時前2個數(shù)據(jù)因其前面的數(shù)據(jù)量不足,所以返回NaN。從索引2開始,每3個連續(xù)的數(shù)據(jù)計算一次均值。s=Series([2,3,5,7,6])s.rolling(3).mean()#每3個數(shù)據(jù)求均值8.7時間序列8.7.3rolling滑動窗口下面利用rolling函數(shù)繪制某支模擬股票的股價均線圖。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltnp.random.seed(7)dates=pd.date_range('2023-1-1','2023-05-31',freq='B')price=np.linspace(10,14,len(dates))+np.random.randn(len(dates))#模擬股價df=pd.DataFrame(price,index=dates,columns=['price'])df.price.plot(label='close') #日線df.price.rolling(5).mean
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西西林縣苗族民歌之分析研究
- 公司紙巾采購合同范本
- 會議合同范本1
- 公司買賣車合同范本
- 農(nóng)村個人購房合同范本
- 2025年度智慧城市照明系統(tǒng)建設項目分包合同模板
- 作品授權合同范本
- 修車廠招工合同范例
- 圓模三角帶行業(yè)深度研究報告
- 勞務合同范本超齡
- 貴州省遵義市數(shù)學小升初試卷及解答參考(2024-2025學年)
- 【課件】2024-2025學年高一上學期英語開學第一課課件
- 專題04 地質(zhì)地貌-備戰(zhàn)2025年高考地理真題題源解密(新高考用)(解析版)
- 市政道路改造工程施工組織設計
- 三年級奧數(shù)專項練習-和差問題
- (2024年)師德師風學習內(nèi)容教師師德師風培訓內(nèi)容通用多篇
- 模板工程風險辨識及防范措施
- 2024版《安全生產(chǎn)法》考試題庫附答案(共130題)
- 教育家精神專題講座課件
- 項目投標BIM方案(投標專用)
- 社區(qū)電動車棚新(擴)建及修建充電車棚施工方案(純方案-)
評論
0/150
提交評論