關注回復“資料”可獲贈Python學習福利
本文主要詳細介紹了pandas的各種基礎操作,源文件為zlJob.csv,可以私我進行獲取,下圖是原始數(shù)據(jù)部分一覽。
pandas官網(wǎng):
https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html
生成數(shù)據(jù)表
數(shù)據(jù)表基本操作
數(shù)據(jù)清洗
時間序列
一般情況下我們得到的數(shù)據(jù)類型大多數(shù)csv或者excel文件,這里僅給出csv,
讀取csv文件
pd.read_csv()
讀取excel文件
pd.read_excel()
pandas可以創(chuàng)建兩種數(shù)據(jù)類型,series和DataFrame;
創(chuàng)建Series(類似于列表,是一個一維序列)
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",
}
)
查看前五行
data.head() # head() 參數(shù)表示前幾行,默認為5
基本信息
data.shape
(990, 9)
data.dtypes
查看空值
data['name'].isnull() # 查看name這一列是否有空值
添加一列
dic = {'name':'前端開發(fā)','salary':2萬-2.5萬, 'company':'上海科技有限公司', 'adress':'上海','eduBack':'本科','companyType':'民營', 'scale':1000-10000人,'info':'小程序'}
df = pd.Series(dic)
df.name = 38738
data = data.append(df)
data.tail()
結果:
刪除一行
data = data.drop([990])
添加一列
data = data["xx"] = range(len(data))
刪除一列
data = data.drop('序號',axis=1)
axis表示軸向,axis=1,表示縱向(刪除一列)
loc
loc主要是基于標簽(label)的,包括行標簽(index)和列標簽(columns),即行名稱和列名稱,可以使用df.loc[index_name,col_name],選擇指定位置的數(shù)據(jù),其它的用法有:
1. 使用單個標簽
data.loc[10,'salary']
# 9千-1.3萬
2. 單個標簽的list
data.loc[:,'name'][:5]
data.loc[:,['name','salary']][:5]
iloc
iloc是基于位置的索引,利用元素在各個軸上的索引序號進行選擇,序號超出范圍會產(chǎn)生IndexError,切片時允許序號超過范圍,用法包括:
1. 使用整數(shù)
data.iloc[2] # 取出索引為2的那一行
2. 使用列表或數(shù)組
data.iloc[:5]
3. 切片對象
data.iloc[:5,:4] # 以,分割,前面切片5行,后面切片4列
常見的方法就如上所示。
series層次化索引
s = pd.Series(np.arange(1,10),index=[list('aaabbccdd'),[1,2,3,1,2,3,1,2,3]])
dataframe層次化索引
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']])
層次化索引應用于當目標數(shù)據(jù)的特征值很多時,我們需要對多個特征進行分析。
首先創(chuàng)建一個簡單的表格:
df = pd.DataFrame({'state':['a','b','c','d'],'year':[1991,1992,1993,1994],'pop':[6.0,7.0,8.0,np.NaN]})
df
結果如下:
判斷缺失值
df['pop'].isnull()
結果如下:
填充缺失值
df['pop'].fillna(0,inplace=True) # 使用0填充缺失值
df
刪除缺失值
data.dropna(how = 'all') # 傳入這個參數(shù)后將只丟棄全為缺失值的那些行
結果如下:
當然還有其他情況:
data.dropna(axis = 1) # 丟棄有缺失值的列(一般不會這么做,這樣會刪掉一個特征)
data.dropna(axis=1,how="all") # 丟棄全為缺失值的那些列
data.dropna(axis=0,subset = ["Age", "Sex"]) # 丟棄'Age’和'Sex’這兩列中有缺失值的行
這里就不做一一展示(原理都是一樣的)
清除字符空格
df['A']=df['A'].map(str.stri())
大小寫轉換
df['A'] = df['A'].str.lower()
刪除后面出現(xiàn)的重復值
df['A'] = df['A'].drop_duplicates() # 某一列后出現(xiàn)重復數(shù)據(jù)被清除
刪除先出現(xiàn)的重復值
df['A'] = df['A'].drop_duplicates(keep=last) # # 某一列先出現(xiàn)重復數(shù)據(jù)被清除
數(shù)據(jù)替換
df['A'].replace('sh','shanghai') # 同于字符串替換
groupby
group = data.groupby(data['name']) # 根據(jù)職位名稱進行分組
group
根據(jù)職位名稱進行分組:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000265DBD335F8>
得到一個對象,我們可以去進行平均值,總和計算;
當然了可以根據(jù)多個特征進行分組,也是沒有問題的;
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 對象的序列或映射。如果傳遞了 dict,排序后的鍵將用作keys
參數(shù),除非傳遞,在這種情況下將選擇值(見下文)。任何 None 對象都將被靜默刪除,除非它們都是 None 在這種情況下將引發(fā) ValueError 。
axis
:{0, 1, …},默認為 0。要沿其連接的軸。
join
: {'inner', 'outer'}, 默認為 'outer'。如何處理其他軸上的索引。外部用于聯(lián)合,內部用于交集。
ignore_index
: 布爾值,默認為 False。如果為 True,則不要使用串聯(lián)軸上的索引值。結果軸將被標記為 0, …, n - 1。如果您在連接軸沒有有意義的索引信息的情況下連接對象,這將非常有用。請注意,其他軸上的索引值在連接中仍然有效。
keys
: 序列,默認無。使用傳遞的鍵作為最外層構建分層索引。如果通過了多個級別,則應包含元組。
levels
: 序列列表,默認無。用于構建 MultiIndex 的特定級別(唯一值)。否則,它們將從密鑰中推斷出來。
names
: 列表,默認無。生成的分層索引中級別的名稱。
verify_integrity
: 布爾值,默認為 False。檢查新的串聯(lián)軸是否包含重復項。相對于實際的數(shù)據(jù)串聯(lián),這可能非常昂貴。
copy
: 布爾值,默認為真。如果為 False,則不要不必要地復制數(shù)據(jù)。
測試:
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
結果如下:
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
:一個 DataFrame 或命名的 Series 對象;right
:另一個 DataFrame 或命名的 Series 對象;
on
: 要加入的列或索引級別名稱;
left_on
:左側 DataFrame 或 Series 的列或索引級別用作鍵??梢允橇忻Q、索引級別名稱或長度等于 DataFrame 或 Series 長度的數(shù)組;right_on
:來自正確 DataFrame 或 Series 的列或索引級別用作鍵??梢允橇忻Q、索引級別名稱或長度等于 DataFrame 或 Series 長度的數(shù)組
left_index
:如果True
,則使用左側 DataFrame 或 Series 中的索引(行標簽)作為其連接鍵;right_index
:與left_index
正確的 DataFrame 或 Series 的用法相同;
how
: 'left'
, 'right'
, 'outer'
, 之一'inner'
。默認為inner
. 有關每種方法的更詳細說明,請參見下文。
測試:
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
結果如下:
相同的字段是'key',所以指定on='key',進行合并。
date = pd.period_range(start='20210913',end='20210919')
date
輸出結果:
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 時間序列在pandas中的應用
index = pd.period_range(start='20210913',end='20210918')
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=index)
df
輸出結果:
本文基于源文件zlJob.csv,進行了部分pandas操作,演示了pandas庫常見的數(shù)據(jù)處理操作,由于pandas功能復雜,具體詳細講解請參見官網(wǎng):
https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html
需要源數(shù)據(jù)的小伙伴可以添加我為好友,私我進行獲取。
------------------- End -------------------
聯(lián)系客服