
文章目錄
- 描述性方法
- 注:
- 匯總資料
- pandas處理文本資料
- 檢查缺失值
- 判斷行列中是否有空資料
- 清洗、填充缺失值
- 清理含有缺失值的行/列
- 在壞值容忍度下洗掉行/列
- 洗掉指定行/列
- 填充缺失值
- 消除資料中的空格
- 去重
描述性方法
在講資料清洗之前,我想先講一些描述性的方法,不然后面講清洗的時候會有點突兀,
| S.No. | 功能 | 描述 |
|---|---|---|
| 1 | count() | 非空觀測值的數量 |
| 2 | sum() | 值的總和 |
| 3 | mean() | 價值的意義 |
| 4 | median() | 價值的中間值 |
| 5 | mode() | 價值觀的模式 |
| 6 | std() | 價值觀的標準差 |
| 7 | min() | 最小值 |
| 8 | max() | 最大值 |
| 9 | abs() | 絕對值 |
| 10 | prod() | 價值的產物 |
| 11 | cumsum() | 累計和 |
| 12 | cumprod() | 累積產品 |
哪個不會用呢?
那來個示例看一下:
df = pd.DataFrame(d)
print(df.std())
偽代碼,僅供參考,
注:
由于DataFrame是一個異構資料結構, 通用操作不適用于所有功能,
sum(),cumsum() 等函式可以同時處理數字和字符(或)字串資料元素,而不會出現任何錯誤,雖然練習中,角色聚合從來不會被普遍使用,但這些功能不會拋出任何例外,
當DataFrame包含字符或字串數??據時 像 abs(),cumprod() 等函式會拋出例外,因為無法執行這些操作,
匯總資料
describe()函式是用來計算有關DataFrame列的統計資訊的摘要,
執行這個函式,我們可以獲得資料的:
Age Rating
count 12.000000 12.000000
mean 31.833333 3.743333
std 9.232682 0.661628
min 23.000000 2.560000
25% 25.000000 3.230000
50% 29.500000 3.790000
75% 35.500000 4.132500
max 51.000000 4.800000
曉得吧,看最左邊那一列,其他都不用看了,
該函式給出了平均值,標準差和IQR值, 而且,函式排除字符列,并給出關于數字列的摘要,
這個函式有一個引數要注意一下:include,
看引數的名字應該猜個八九不離十了吧,包含,對,如果我們的列數很多的時候,我又不想查看所有列的描述,那這樣不就很麻煩?于是就給了include這個引數讓你自己去選,
include默認為“數字”,當然,除了可以自定義以外,系統也提供了以下幾個選擇:
object - 匯總字串列
number - 匯總數字列
all - 將所有列匯總在一起(不應將其作為串列值傳遞)
pandas處理文本資料
Pandas提供了一組字串函式,可以很容易地對字串資料進行操作,最重要的是,這些函式忽略(或排除)丟失/ NaN值,
| S.No | 功能 | 描述 |
|---|---|---|
| 1 | lower() | 將Series / Index中的字串轉換為小寫字母, |
| 2 | upper() | 將Series / Index中的字串轉換為大寫, |
| 3 | len() | 計算字串的長度(), |
| 4 | strip() | 幫助從兩側洗掉Series / index中每個字串的空格(包括換行符), |
| 5 | split(’ ') | 用給定的模式分割每個字串, |
| 6 | cat(sep=’ ') | 使用給定的分隔符連接序列/索引元素, |
| 7 | get_dummies() | 用One-Hot Encoded值回傳DataFrame, |
| 8 | contains(pattern) | 如果子字串包含在元素中,則回傳每個元素的布林值True,否則回傳False, |
| 9 | replace(a,b) | 替換值 一個 與值 b , |
| 10 | repeat(value) | 以指定的次數重復每個元素, |
| 11 | count(pattern) | 回傳每個元素中的模式出現次數, |
| 12 | startswith(pattern) | 如果Series / Index中的元素以模式開始,則回傳true, |
| 13 | endswith(pattern) | 如果Series / Index中的元素以模式結尾,則回傳true, |
| 14 | find(pattern) | 回傳模式第一次出現的第一個位置, |
| 15 | findall(pattern) | 回傳模式的所有出現的串列, |
| 16 | swapcase | 將箱子更換/更換, |
| 17 | islower() | 檢查Series / Index中每個字串中的所有字符是否小寫,回傳布林值 |
| 18 | isupper() | 檢查Series / Index中每個字串中的所有字符是否大寫,回傳布林值, |
| 19 | isnumeric() | 檢查Series / Index中每個字串中的所有字符是否為數字,回傳布林值, |
檢查缺失值
為了更容易地檢測缺失值(以及跨越不同的陣列dtype),Pandas提供了 isnull() 和 notnull() 函式,它們也是Series和DataFrame物件的方法(python中用NaN(Not a Number)表示缺失資料):
df = pd.DataFrame([[1,5,8],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
0 1 2
0 1.0 5.0 8.0
1 2.0 NaN NaN
2 2.0 3.0 NaN
3 NaN NaN NaN
判斷行列中是否有空資料
axis=0,代表列,axis=1代表行
查看行:df.isnull().any(axis=1)
查看列:df.isnull().any(axis=0)
我弄了個按行判斷的你們看一下:
0 False
1 True
2 True
3 True
dtype: bool
再看一下這個:
查看行:df.notnull().all(axis=1)
查看列:df.notnull().all(axis=0)
這個的話,只要有非空資料,就會被判斷為True,
以上方法,都可以通過取反符號“~”來進行取反,
print(~df.isnull().any(axis = 1))
也可以通過loc()方法來進行取值,
比方說我要取出所有非空資料行,可以這樣來進行實作:
df = df.loc[~df.isnull().any(axis = 1)]
0 1 2
0 1.0 5.0 8.0
至于這個loc()方法,等會兒會說,
你也可以指定一列來進行空值的判斷:
print(df[1].isnull()) # 判斷一列的空值
print(df[1].isnull().value_counts()) # 對一列空值數量進行統計
清洗、填充缺失值
清理含有缺失值的行/列
相對來說有一個很直接的方法,直接將所有有空值的行、列進行清除:
df = pd.DataFrame([[1,5,8],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df = df.dropna()
print(df)
不附加任何的額外條件,只要你那一行里面存在空值,一行清理,
0 1 2
0 1.0 5.0 8.0
如果是要按列清理呢?那就加上:
df = pd.DataFrame([[1,5,8],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df = df.dropna(axis=1)
print(df)
啊,很遺憾的告訴你,全部被清理了,一點不剩,因為每一列都有空值啊,,,
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
在壞值容忍度下洗掉行/列
好,那你現在跟我說,你覺得一行有那么一兩個壞值其實是可以忍受的,那我怎么辦?那我不還得給你辦嘛:
# 只要有n個值是好的,就留下:
df = pd.DataFrame([[1,5,8],[np.nan,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df = df.dropna(thresh=1) # n
print(df)
0 1 2
0 1.0 5.0 8.0
2 2.0 3.0 NaN
對吧,那這要不是你想要的,那我也沒辦法了,
洗掉指定行/列
還有什么,洗掉指定列?洗掉指定行?那試試看嘛,摸索一下,
df = pd.DataFrame([[1,5,8],[np.nan,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df = df.drop(labels=1)
print(df)
0 1 2
0 1.0 5.0 8.0
2 2.0 3.0 NaN
3 NaN NaN NaN
吶,我把那第一列刪了,
神乎其技!!!
df = pd.DataFrame([[1,5,8],[np.nan,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df = df.drop(columns=2)
print(df)
不好意思,上面刪的是一行,這里才是刪一列,,,
0 1
0 1.0 5.0
1 NaN NaN
2 2.0 3.0
3 NaN NaN
填充缺失值
現在讓我們把資料集換回去,
然后填充一下缺失值:
df = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df = df.fillna(value=0) # 以指定值對缺失值進行填補
print(df)
0 1 2
0 1.0 5.0 0.0
1 2.0 0.0 0.0
2 2.0 3.0 0.0
3 0.0 0.0 0.0
用某一列的平均值對某一列進行填充:
df = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
print(df)
df[1] = df.fillna(df[1].mean())
print(df)
0 1 2
0 1.0 5.0 NaN
1 2.0 NaN NaN
2 2.0 3.0 NaN
3 NaN NaN NaN
0 1 2
0 1.0 5.0 1.0
1 2.0 NaN 2.0
2 2.0 3.0 2.0
3 NaN NaN NaN
要不你試試第二列?
吶,不指定列試試看:
df = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
print(df)
df = df.fillna(df.mean())
print(df)
自上而下填充:
df = df.fillna(method='ffill')
print(df)
0 1 2
0 1.0 5.0 NaN
1 2.0 NaN NaN
2 2.0 3.0 NaN
3 NaN NaN NaN
0 1 2
0 1.0 5.0 NaN
1 2.0 5.0 NaN
2 2.0 3.0 NaN
3 2.0 3.0 NaN
有自上而下就有自下而上了:
df = df.fillna(method='bfill')
print(df)
0 1 2
0 1.0 5.0 NaN
1 2.0 NaN NaN
2 2.0 3.0 NaN
3 NaN NaN NaN
0 1 2
0 1.0 5.0 NaN
1 2.0 3.0 NaN
2 2.0 3.0 NaN
3 NaN NaN NaN
消除資料中的空格
# 創建含有空格的資料
dict1 = {"name": ["小紅", "小明", "小張"], "age": [16, 17, 18], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
print(df2)
# 清除空格
df2["city"] = df2["city"].map(str.strip)
print(df2)
name age city
0 小紅 16 北京
1 小明 17 杭州
2 小張 18 上海
name age city
0 小紅 16 北京
1 小明 17 杭州
2 小張 18 上海
去重
如果你拿到一個資料集,非常大,你感覺里面有不少重復值,想要進行一波去重操作,怎么辦?
還有一個drop_duplicates還沒看,
換個資料集玩玩吧,一直用那個也累了,
df = pd.DataFrame({'Country':[1,1,2,12,34,23,45,34,23,12,2,3,4,1],
'Income':[1,1,2,10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000,3000,15666,1],
'Age':[1,1,2,50, 43, 34, 40, 25, 25, 45, 32,12,32,1],
'group':[1,1,2,'a','b','s','d','f','g','h','a','d','a',1]})
Country Income Age group
0 1 1 1 1
1 1 1 1 1
2 2 2 2 2
3 12 10000 50 a
4 34 10000 43 b
5 23 5000 34 s
6 45 5002 40 d
7 34 40000 25 f
8 23 50000 25 g
9 12 8000 45 h
10 2 5000 32 a
11 3 3000 12 d
12 4 15666 32 a
13 1 1 1 1
直接上手去重:
df.drop_duplicates(inplace=True) #inplace=True 對原表進行修改
Country Income Age group
0 1 1 1 1
2 2 2 2 2
3 12 10000 50 a
4 34 10000 43 b
5 23 5000 34 s
6 45 5002 40 d
7 34 40000 25 f
8 23 50000 25 g
9 12 8000 45 h
10 2 5000 32 a
11 3 3000 12 d
12 4 15666 32 a
少了一列啊,
大家看資料表中的索引,在我們使用drop_duplicates洗掉重復行時,重復行相對應的索引值也是被默認洗掉掉的,也就是說,索引值已經發生了變化,
那我們該如何解決這個問題呢?
df.drop_duplicates(inplace=True)
df = df.reset_index(drop=True)
print(df)
Country Income Age group
0 1 1 1 1
1 2 2 2 2
2 12 10000 50 a
3 34 10000 43 b
4 23 5000 34 s
5 45 5002 40 d
6 34 40000 25 f
7 23 50000 25 g
8 12 8000 45 h
9 2 5000 32 a
10 3 3000 12 d
11 4 15666 32 a
如果要指定保留的重復行(默認是第一行),可以使用keep引數:一般沒什么給你選的,要么就first,要么就last,
對指定的資料列進行去重:
df.drop_duplicates(inplace=True,subset = ['Age'],keep='last')
df = df.reset_index(drop=True)
print(df)
0 2 2 2 2
1 12 10000 50 a
2 34 10000 43 b
3 23 5000 34 s
4 45 5002 40 d
5 23 50000 25 g
6 12 8000 45 h
7 3 3000 12 d
8 4 15666 32 a
9 1 1 1 1
如果要多幾行呢?
這操作叫什么?思考一下資料庫中的主鍵,
df.drop_duplicates(inplace=True,subset = ['Age','group'],keep='last')
df = df.reset_index(drop=True)
print(df)
Country Income Age group
0 2 2 2 2
1 12 10000 50 a
2 34 10000 43 b
3 23 5000 34 s
4 45 5002 40 d
5 34 40000 25 f
6 23 50000 25 g
7 12 8000 45 h
8 3 3000 12 d
9 4 15666 32 a
10 1 1 1 1
如果不出意外,這篇就到這里啦,see you!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274074.html
標籤:python
下一篇:怎么給結構體分配記憶體并且賦值?
