關(guān)注回復(fù)“資料”可獲贈(zèng)Python學(xué)習(xí)福利 大家好,我是皮皮。其實(shí)這個(gè)pandas教程,卷的很嚴(yán)重了,才哥,小P等人寫了很多的文章,這篇文章是粉絲【古月星辰】投稿,自己學(xué)習(xí)過(guò)程中整理的一些基礎(chǔ)資料,整理成文,這里發(fā)出來(lái)給大家一起學(xué)習(xí)。Pandas入門本文主要詳細(xì)介紹了pandas的各種基礎(chǔ)操作,源文件為zlJob.csv,可以私我進(jìn)行獲取,下圖是原始數(shù)據(jù)部分一覽。 pandas官網(wǎng): https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html
目錄結(jié)構(gòu):生成數(shù)據(jù)表 數(shù)據(jù)表基本操作 數(shù)據(jù)清洗 時(shí)間序列
一.生成數(shù)據(jù)表1.1 數(shù)據(jù)讀取一般情況下我們得到的數(shù)據(jù)類型大多數(shù)csv或者excel文件,這里僅給出csv, 1.2 數(shù)據(jù)的創(chuàng)建pandas可以創(chuàng)建兩種數(shù)據(jù)類型,series和DataFrame; 創(chuàng)建Series(類似于列表,是一個(gè)一維序列) s = pd.Series([1,2,3,4,5])
創(chuàng)建dataframe(類似于excel表格,是二維數(shù)據(jù)) df2 = pd.DataFrame( { "A": 1.0, "B": pd.Timestamp("20130102"), "C": pd.Series(1, index=list(range(4)), dtype="float32"), "D": np.array([3] * 4, dtype="int32"), "E": pd.Categorical(["test", "train", "test", "train"]), "F": "foo", } )
二、數(shù)據(jù)表的基本操作2.1 數(shù)據(jù)查看查看前五行 data.head() # head() 參數(shù)表示前幾行,默認(rèn)為5
data['name'].isnull() # 查看name這一列是否有空值
2.2 行和列的操作dic = {'name':'前端開(kāi)發(fā)','salary':2萬(wàn)-2.5萬(wàn), 'company':'上海科技有限公司', 'adress':'上海','eduBack':'本科','companyType':'民營(yíng)', 'scale':1000-10000人,'info':'小程序'}
df = pd.Series(dic) df.name = 38738 data = data.append(df) data.tail()
結(jié)果: data = data["xx"] = range(len(data))
data = data.drop('序號(hào)',axis=1)
axis表示軸向,axis=1,表示縱向(刪除一列) 2.3 索引操作iloc是基于位置的索引,利用元素在各個(gè)軸上的索引序號(hào)進(jìn)行選擇,序號(hào)超出范圍會(huì)產(chǎn)生IndexError,切片時(shí)允許序號(hào)超過(guò)范圍,用法包括: 1. 使用整數(shù) data.iloc[2] # 取出索引為2的那一行
2. 使用列表或數(shù)組
3. 切片對(duì)象 data.iloc[:5,:4] # 以,分割,前面切片5行,后面切片4列
常見(jiàn)的方法就如上所示。 2.4 層次化索引s = pd.Series(np.arange(1,10),index=[list('aaabbccdd'),[1,2,3,1,2,3,1,2,3]])
df = pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['X','X','Y'],['m','n','t']])
層次化索引應(yīng)用于當(dāng)目標(biāo)數(shù)據(jù)的特征值很多時(shí),我們需要對(duì)多個(gè)特征進(jìn)行分析。 三、數(shù)據(jù)預(yù)處理3.1 缺失值處理首先創(chuàng)建一個(gè)簡(jiǎn)單的表格: df = pd.DataFrame({'state':['a','b','c','d'],'year':[1991,1992,1993,1994],'pop':[6.0,7.0,8.0,np.NaN]}) df
結(jié)果如下: 判斷缺失值 結(jié)果如下: 填充缺失值 df['pop'].fillna(0,inplace=True) # 使用0填充缺失值 df
刪除缺失值 data.dropna(how = 'all') # 傳入這個(gè)參數(shù)后將只丟棄全為缺失值的那些行 結(jié)果如下: 當(dāng)然還有其他情況: data.dropna(axis = 1) # 丟棄有缺失值的列(一般不會(huì)這么做,這樣會(huì)刪掉一個(gè)特征) data.dropna(axis=1,how="all") # 丟棄全為缺失值的那些列 data.dropna(axis=0,subset = ["Age", "Sex"]) # 丟棄'Age’和'Sex’這兩列中有缺失值的行
這里就不做一一展示(原理都是一樣的) 3.2 字符處理df['A']=df['A'].map(str.stri())
df['A'] = df['A'].str.lower()
3.3 重復(fù)值處理df['A'] = df['A'].drop_duplicates() # 某一列后出現(xiàn)重復(fù)數(shù)據(jù)被清除
df['A'] = df['A'].drop_duplicates(keep=last) # # 某一列先出現(xiàn)重復(fù)數(shù)據(jù)被清除
df['A'].replace('sh','shanghai') # 同于字符串替換
四、數(shù)據(jù)表操作分組groupby group = data.groupby(data['name']) # 根據(jù)職位名稱進(jìn)行分組 group
根據(jù)職位名稱進(jìn)行分組: <pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000265DBD335F8>
得到一個(gè)對(duì)象,我們可以去進(jìn)行平均值,總和計(jì)算; 當(dāng)然了可以根據(jù)多個(gè)特征進(jìn)行分組,也是沒(méi)有問(wèn)題的; 聚合concat(): pd.concat( objs, axis=0, join="outer", ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True, )
官網(wǎng)參數(shù)解釋如下: objs : Series 或 DataFrame 對(duì)象的序列或映射。如果傳遞了 dict,排序后的鍵將用作keys 參數(shù),除非傳遞,在這種情況下將選擇值(見(jiàn)下文)。任何 None 對(duì)象都將被靜默刪除,除非它們都是 None 在這種情況下將引發(fā) ValueError 。
axis :{0, 1, …},默認(rèn)為 0。要沿其連接的軸。
join : {'inner', 'outer'}, 默認(rèn)為 'outer'。如何處理其他軸上的索引。外部用于聯(lián)合,內(nèi)部用于交集。
ignore_index : 布爾值,默認(rèn)為 False。如果為 True,則不要使用串聯(lián)軸上的索引值。結(jié)果軸將被標(biāo)記為 0, …, n - 1。如果您在連接軸沒(méi)有有意義的索引信息的情況下連接對(duì)象,這將非常有用。請(qǐng)注意,其他軸上的索引值在連接中仍然有效。
keys : 序列,默認(rèn)無(wú)。使用傳遞的鍵作為最外層構(gòu)建分層索引。如果通過(guò)了多個(gè)級(jí)別,則應(yīng)包含元組。
levels : 序列列表,默認(rèn)無(wú)。用于構(gòu)建 MultiIndex 的特定級(jí)別(唯一值)。否則,它們將從密鑰中推斷出來(lái)。
names : 列表,默認(rèn)無(wú)。生成的分層索引中級(jí)別的名稱。
verify_integrity : 布爾值,默認(rèn)為 False。檢查新的串聯(lián)軸是否包含重復(fù)項(xiàng)。相對(duì)于實(shí)際的數(shù)據(jù)串聯(lián),這可能非常昂貴。
copy : 布爾值,默認(rèn)為真。如果為 False,則不要不必要地復(fù)制數(shù)據(jù)。
測(cè)試: df1 = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], }, index=[0, 1, 2, 3], )
df2 = pd.DataFrame( { "A": ["A4", "A5", "A6", "A7"], "B": ["B4", "B5", "B6", "B7"], "C": ["C4", "C5", "C6", "C7"], "D": ["D4", "D5", "D6", "D7"], }, index=[4, 5, 6, 7], )
df3 = pd.DataFrame( { "A": ["A8", "A9", "A10", "A11"], "B": ["B8", "B9", "B10", "B11"], "C": ["C8", "C9", "C10", "C11"], "D": ["D8", "D9", "D10", "D11"], }, index=[8, 9, 10, 11], )
frames = [df1, df2, df3]
result = pd.concat(frames) result
結(jié)果如下: merge() pd.merge( left, right, how="inner", on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=("_x", "_y"), copy=True, indicator=False, validate=None, )
這里給出常用參數(shù)解釋: left :一個(gè) DataFrame 或命名的 Series 對(duì)象;right :另一個(gè) DataFrame 或命名的 Series 對(duì)象;
on : 要加入的列或索引級(jí)別名稱;
left_on :左側(cè) DataFrame 或 Series 的列或索引級(jí)別用作鍵。可以是列名稱、索引級(jí)別名稱或長(zhǎng)度等于 DataFrame 或 Series 長(zhǎng)度的數(shù)組;right_on :來(lái)自正確 DataFrame 或 Series 的列或索引級(jí)別用作鍵??梢允橇忻Q、索引級(jí)別名稱或長(zhǎng)度等于 DataFrame 或 Series 長(zhǎng)度的數(shù)組
left_index :如果True ,則使用左側(cè) DataFrame 或 Series 中的索引(行標(biāo)簽)作為其連接鍵;right_index :與left_index 正確的 DataFrame 或 Series 的用法相同;
how : 'left' , 'right' , 'outer' , 之一'inner' 。默認(rèn)為inner . 有關(guān)每種方法的更詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)下文。
測(cè)試: left = pd.DataFrame( { "key": ["K0", "K1", "K2", "K3"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], } )
right = pd.DataFrame( { "key": ["K0", "K1", "K2", "K3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], } )
result = pd.merge(left, right, on="key") result
結(jié)果如下: 相同的字段是'key',所以指定on='key',進(jìn)行合并。 五、時(shí)間序列5.1 生成一段時(shí)間范圍date = pd.period_range(start='20210913',end='20210919') date
輸出結(jié)果: PeriodIndex(['2021-09-13', '2021-09-14', '2021-09-15', '2021-09-16', '2021-09-17', '2021-09-18', '2021-09-19'], dtype='period[D]', freq='D')
5.2 時(shí)間序列在pandas中的應(yīng)用 index = pd.period_range(start='20210913',end='20210918') df = pd.DataFrame(np.arange(24).reshape((6,4)),index=index) df
輸出結(jié)果: 六、總結(jié) 本文基于源文件zlJob.csv,進(jìn)行了部分pandas操作,演示了pandas庫(kù)常見(jiàn)的數(shù)據(jù)處理操作,由于pandas功能復(fù)雜,具體詳細(xì)講解請(qǐng)參見(jiàn)官網(wǎng): https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html
需要源數(shù)據(jù)的小伙伴可以添加我為好友,私我進(jìn)行獲取。 ------------------- End -------------------
|