Python數據分析--Pandas知識點(一)


本文主要是總結學習pandas過程中用到的函數和方法, 在此記錄, 防止遺忘

1. 重復值的處理

利用drop_duplicates()函數刪除數據表中重復多余的記錄, 比如刪除重復多余的ID.

1 import pandas as pd
2 df = pd.DataFrame({"ID": ["A1000","A1001","A1002", "A1002"],
3                  "departmentId": [60001,60001, 60001, 60001]})
4 df.drop_duplicates()

2. 缺失值的處理

缺失值是數據中因缺少信息而造成的數據聚類, 分組, 截斷等

2.1 缺失值產生的原因

主要原因可以分為兩種: 人為原因和機械原因.

1) 人為原因: 由於人的主觀失誤造成數據的缺失, 比如數據錄入人員的疏漏;

2) 機械原因: 由於機械故障導致的數據收集或者數據保存失敗從而造成數據的缺失.

2.2 缺失值的處理方式 

缺失值的處理方式通常有三種: 補齊缺失值, 刪除缺失值, 刪除缺失值, 保留缺失值.

1) 補齊缺失值: 使用計算出來的值去填充缺失值, 例如樣本平均值.

使用fillna()函數對缺失值進行填充, 使用mean()函數計算樣本平均值.

1 import pandas as pd
2 import numpy as np
3 df = pd.DataFrame({'ID':['A10001', 'A10002', 'A10003', 'A10004'], 
4                    "Salary":[11560, np.NaN, 12988,12080]})
5 #用Salary字段的樣本均值填充缺失值
6 df["Salary"] = df["Salary"].fillna(df["Salary"].mean())
7 df

2) 刪除缺失值: 當數據量大時且缺失值占比較小可選用刪除缺失值的記錄.

示例: 刪除entrytime中缺失的值, 采用dropna函數對缺失值進行刪除:

1 import pandas as pd
2 df = pd.DataFrame({"ID": ["A1000","A1001","A1002"],
3                  "entrytime": ["2015-05-06",pd.NaT,"2016-07-01" ]})
4 df.dropna()

3) 保留缺失值. 

3. 刪除前后空格

使用strip()函數刪除前后空格.

1 import pandas as pd
2 df = pd.DataFrame({"ID": ["A1000","A1001","A1002"],
3                  "Surname": [" Zhao ","Qian"," Sun " ]})
4 df["Surname"] = df["Surname"].str.strip()
5 df

4. 查看數據類型

查看所有列的數據類型使用dtypes, 查看單列使用dtype, 具體用法如下:

1 import pandas as pd
2 df =  pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})
3 #查看所有列的數據類型
4 df.dtypes
5 #查看單列的數據類型
6 df["ID"].dtype

5. 修改數據類型

使用astype()函數對數據類型進行修改, 用法如下

1 import pandas as pd
2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})
3 #將ID列的類型轉化為字符串的格式
4 df["ID"].astype(str)

6. 字段的抽取

使用slice(start, end)函數可完成字段的抽取, 注意start是從0開始且不包含end. 比如抽取前兩位slice(0, 2).

1 import pandas as pd
2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})
3 #需要將ID列的類型轉換為字符串, 否則無法使用slice()函數
4 df["ID"]= df["ID"].astype(str)
5 #抽取ID前兩位
6 df["ID"].str.slice(0,2)

 7. 字段的拆分

使用split()函數進行字段的拆分, split(pat=None, n = -1, expand=True)函數包含三個參數:

第一個參數則是分隔的字符串, 默認是以空格分隔

第二個參數則是分隔符使用的次數, 默認分隔所有

第三個參數若是True, 則在不同的列展開, 否則以序列的形式顯示.

1 import pandas as pd
2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})
3 #對Surname_Age字段進行拆分
4 df_new = df["Surname_Age"].str.split("_", expand =True)
5 df_new

8. 字段的命名

有兩種方式一種是使用rename()函數, 另一種是直接設置columns參數

1 import pandas as pd
2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})
3 #第一種方法使用rename()函數
4 # df_new = df["Surname_Age"].str.split("_", expand =True).rename(columns={0: "Surname", 1: "Age"})
5 # df_new
6 #第二種方法直接設置columns參數
7 df_new = df["Surname_Age"].str.split("_", expand =True)
8 df_new.columns = ["Surname","Age"]
9 df_new

 兩種方式同樣的結果:

9. 字段的合並

使用merge()函數對字段進行合並操作.

1 import pandas as pd
2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})
3 df_new = df["Surname_Age"].str.split("_", expand =True)
4 df_new.columns = ["Surname","Age"]
5 #使用merge函數對兩表的字段進行合並操作.
6 pd.merge(df, df_new, left_index =True, right_index=True)

10. 字段的刪除

利用drop()函數對字段進行刪除.

1 import pandas as pd
2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})
3 df_new = df["Surname_Age"].str.split("_", expand =True)
4 df_new.columns = ["Surname","Age"]
5 df_mer= pd.merge(df, df_new, left_index =True, right_index=True)
6 #drop()刪除字段,第一個參數指要刪除的字段,axis=1表示字段所在列,inplace為True表示在當前表執行刪除.
7 df_mer.drop("Surname_Age", axis = 1, inplace =True)
8 df_mer

刪除Surname_Age字段成功:

11. 記錄的抽取

1) 關系運算: df[df.字段名 關系運算符 數值], 比如抽取年齡大於30歲的記錄.

 1 import pandas as pd
 2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})
 3 df_new = df["Surname_Age"].str.split("_", expand =True)
 4 df_new.columns = ["Surname","Age"]
 5 df_mer= pd.merge(df, df_new, left_index =True, right_index=True)
 6 df_mer.drop("Surname_Age", axis = 1, inplace =True)
 7 #將Age字段數據類型轉化為整型
 8 df_mer["Age"] = df_mer["Age"].astype(int)
 9 #抽取Age中大於30的記錄
10 df_mer[df_mer.Age > 30]

 

2) 范圍運算: df[df.字段名.between(s1, s2)], 注意既包含s1又包含s2, 比如抽取年齡大於等於23小於等於28的記錄.

df_mer[df_mer.Age.between(23,28)]

3) 邏輯運算: 與(&) 或(|) 非(not)

比如上面的范圍運算df_mer[df_mer.Age.between(23,28)]就等同於df_mer[(df_mer.Age >= 23) & (df_mer.Age <= 28)]

df_mer[(df_mer.Age >= 23 ) & (df_mer.Age <= 28)]

 

4) 字符匹配: df[df.字段名.str.contains("字符", case = True, na =False)] contains()函數中case=True表示區分大小寫, 默認為True; na = False表示不匹配缺失值.

1 import pandas as pd
2 import numpy as np
3 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]})
4 #匹配SpouseAge中包含2的記錄
5 df[df.SpouseAge.str.contains("2",na = False)]

 

當na改為True時, 結果為:

5) 缺失值匹配: df[pd.isnull(df.字段名)]表示匹配該字段中有缺失值的記錄.

1 import pandas as pd
2 import numpy as np
3 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]})
4 #匹配SpouseAge中有缺失值的記錄
5 df[pd.isnull(df.SpouseAge)]

12.記錄的合並

使用concat()函數可以將兩個或者多個數據表的記錄合並一起, 用法: pandas.concat([df1, df2, df3.....])

1 import pandas as pd
2 df1 = pd.DataFrame({"ID": ["A10006","A10001"],"Salary": [12000, 20000]})
3 df2 = pd.DataFrame({"ID": ["A10008"], "Salary": [10000]})
4 #使用concat()函數將df1與df2的記錄進行合並
5 pd.concat([df1, df2])

 

以上是部分內容, 還會持續總結更新....

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM