日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python科学计算笔记(十四)pandas数据过滤、清理、转换

發布時間:2024/1/23 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python科学计算笔记(十四)pandas数据过滤、清理、转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇博客主要內容

1)移除重復數據(duplicated)

2)利用函數或映射進行數據轉換(map)

3)替換值(replace)

4)重命名軸索引

5)檢測和過濾異常值(邏輯索引)

6)隨機采樣或選出隨機子集

7)計算啞變量(get_dummies)

1)移除重復數據

檢查某列數據是否重復可用.is_unique

檢查某行數據是否重復可用.duplicated

import pandas as pd import numpy as npdata = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4,'k2':[1,1,2,3,3,4,4]}) data ?k1k20123456
one1
one1
one2
two3
two3
two4
two4

檢查列以及行中重復數據

data.index.is_unique#檢查列 True data.k1.is_unique#檢查列 False data['k2'].is_unique#檢查列 False data.is_unique ---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-12-3c5fb82b7563> in <module>() ----> 1 data.is_uniqueC:\Program Files\anaconda\lib\site-packages\pandas\core\generic.pyc in __getattr__(self, name)2670 if name in self._info_axis:2671 return self[name] -> 2672 return object.__getattribute__(self, name)2673 2674 def __setattr__(self, name, value):AttributeError: 'DataFrame' object has no attribute 'is_unique' data.duplicated()#檢查行 0 False1 True2 False3 False4 True5 False6 Truedtype: bool

移除重復行

data.drop_duplicates() ?k1k20235
one1
one2
two3
two4
set(data.k1)#保留唯一的列屬性值 {'one', 'two'}

移除重復值小結

1) drop_duplicates、duolicated函數只能用于DataFrame

2) is_unique不能用于DataFrame

2)利用函數或映射進行數據轉換

data1 = pd.DataFrame({'food':['bacon','pork','bacon','Pastrami',\'beef','Bacon','pastrami','ham','lox'],\'ounces':[4,3,12,6,7.5,8,3,5,6]}) data1 ?foodounces012345678
bacon4.0
pork3.0
bacon12.0
Pastrami6.0
beef7.5
Bacon8.0
pastrami3.0
ham5.0
lox6.0

添加一列表示肉類來源的動物類型

#step1:構建肉類到動物的映射 meat_to_animal = {'bacon':'pig','pork':'pig','pastrami':'cow','beef':'cow','ham':'pig',\'lox':'salmon'}

Series的map方法可以接受一個函數或含有映射關系的字典型對象,字符的大小寫要一致

#step2:映射 data1['animal'] = data1['food'].map(str.lower).map(meat_to_animal) data1 ?foodouncesanimal012345678
bacon4.0pig
pork3.0pig
bacon12.0pig
Pastrami6.0cow
beef7.5cow
Bacon8.0pig
pastrami3.0cow
ham5.0pig
lox6.0salmon
#step2的另一種實現方法data1['food'].map(lambda x:meat_to_animal[x.lower()]) 0 pig1 pig2 pig3 cow4 cow5 pig6 cow7 pig8 salmonName: food, dtype: object data1 ?foodouncesanimal012345678
bacon4.0pig
pork3.0pig
bacon12.0pig
Pastrami6.0cow
beef7.5cow
Bacon8.0pig
pastrami3.0cow
ham5.0pig
lox6.0salmon

map是一種實現元素級轉換記憶其他數據清理工作的便捷方式

map會改變原始數據集

3)替換值

替換缺失值的方法:

1)fillna

2)含有重復索引的合并combine_first

3)replace

data2 = pd.Series([1.,-999,2,-999,-1000,3.]) data2 0 1.0 1 -999.0 2 2.0 3 -999.0 4 -1000.0 5 3.0dtype: float64

-999可能是一個表示缺失數據的標記值,要將其替換為pandas能夠理解的NA值,可以利用replace

data2.replace(-999,np.nan) 0 1.01 NaN2 2.03 NaN4 -1000.05 3.0dtype: float64 data2 0 1.0 1 -999.0 2 2.0 3 -999.0 4 -1000.0 5 3.0dtype: float64

replace不改變原數據集

一次性替換多個值

data2.replace([-999,-1000],np.nan)#一次傳入一個列表即可 0 1.01 NaN2 2.03 NaN4 NaN5 3.0dtype: float64 data2.replace([-999,-1000],[np.nan,0]) 0 1.01 NaN2 2.03 NaN4 0.05 3.0dtype: float64 data2.replace({-999:np.nan,-1000:0}) 0 1.01 NaN2 2.03 NaN4 0.05 3.0dtype: float64

4)重命名軸索引

跟Series中的值一樣,軸標簽也可以通過函數或映射進行轉換,從而得到一個新對象,軸還可以被就地修改,而無需新建一個數據結構

data3 = pd.DataFrame(np.arange(12).reshape(3,4),index = ['a','b','c'],columns = ['one','two','three','four']) data3 ?onetwothreefourabc
0123
4567
891011
data3.index.map(str.upper) array(['A', 'B', 'C'], dtype=object) data3 ?onetwothreefourabc
0123
4567
891011
data3.index = data3.index.map(str.upper)#修改了 data3 ?onetwothreefourABC
0123
4567
891011

還可以通過rename結合字典型對象實現對部分軸標簽的更新

data3.rename(index = {'A':'aaa'},columns = {'three':'liu'}) ?onetwoliufouraaaBC
0123
4567
891011
data3#不改變原數據 ?onetwothreefourABC
0123
4567
891011
data3 = data3.rename(index = {'A':'aaa'},columns = {'three':'liu'}) data3 ?onetwoliufouraaaBC
0123
4567
891011

5)檢測和過濾異常值

這里的異常值的閾值已知,因此,異常值的過濾或變換運算很大程度上其實就是邏輯數組運算。

data4 = pd.DataFrame(np.random.randn(1000,4)) data4.info() data4.describe() ?0123countmeanstdmin25%50%75%max
1000.0000001000.0000001000.0000001000.000000
0.023986-0.0140490.032299-0.037661
0.9945711.0035221.0099391.017361
-3.526970-3.298974-3.429383-3.421995
-0.632426-0.685564-0.665548-0.756219
0.0133260.006130-0.017911-0.015297
0.6332790.6702610.6738490.665360
3.5496203.1425033.9910283.086376

找出某列絕對值大于3的值

data4[3][np.abs(data4[3]) > 3] 189 -3.421995 335 3.086376 590 -3.388477 778 -3.100379Name: 3, dtype: float64

找出全部或含有“超過3或-3的值”的行

(np.abs(data4) > 3).any(1).head() 0 False1 False2 False3 False4 Falsedtype: bool data4[(np.abs(data4) > 3).any(1)] ?0123109189291335447464546573590660663778814853899
3.549620-0.943976-0.0584900.941503
-0.071249-1.3503610.385375-3.421995
2.3379613.142503-0.208999-0.485979
0.230998-1.3972592.7342293.086376
-3.526970-0.2894671.0994871.206039
0.011728-0.3987393.1044700.459924
0.3579440.0070633.9910280.722481
-3.019947-0.982651-1.7272891.484966
0.2110690.3440590.656351-3.388477
0.9301033.117643-1.372034-1.208730
0.362668-3.298974-1.0331280.900985
0.0941720.8279372.617724-3.100379
-1.450645-1.131513-3.429383-0.828139
1.188536-3.069987-0.7467000.745037
2.4490300.4299593.025705-1.571179

替換異常值

data4[np.abs(data4) > 3] = np.sign(data) * 3 data4.isnull().sum()#有空值 0 31 42 43 4dtype: int64 data4 = data4.replace(np.nan,0) data4.isnull().sum()#無空值 0 01 02 03 0dtype: int64 data4.describe()###????????? ?0123countmeanstdmin25%50%75%max
1000.0000001000.0000001000.0000001000.000000
0.026983-0.0139410.025608-0.030836
0.9771520.9834210.9868310.996554
-2.749595-2.799638-2.943564-2.743207
-0.630318-0.682237-0.663014-0.739291
0.0124450.000613-0.017171-0.004484
0.6311460.6680230.6602360.659204
2.8298042.9150312.9076552.679495

6)排列和隨機采樣

1)numpy.random.permutation函數

2)np.random.randint生成隨機數

df = pd.DataFrame(np.arange(5 *4).reshape(5,4))sampler = np.random.permutation(5) df ?012301234
0123
4567
891011
12131415
16171819
sampler array([0, 1, 3, 4, 2]) df.ix[sampler] ?012301342
0123
4567
12131415
16171819
891011
df.take(sampler) ?012301342
0123
4567
12131415
16171819
891011

通過np.random.randint得到一組隨機整數

sampler1 = np.random.randint(0,len(df),size = 4) sampler1 array([2, 2, 3, 0]) df1 = df.take(sampler1)
  • 1
df1 ?01232230
891011
891011
12131415
0123

7)計算指標/啞變量

將分類變量(categorical variable)轉換為(啞變量矩陣,dummy matrix)或(指標矩陣,indicator matrix)是常用于統計學習建模或機器學習的轉換方式。

即 DataFrame的某一列中含有k個不同的值,則可以派生出一個k列矩陣或DataFrame(其值為1或0)。

pandas中的get_dummies函數可以實現以上功能

df2 = pd.DataFrame({'key':['b','a','b','c','a','b'],'data1':range(6)})df2 ?data1key012345
0b
1a
2b
3c
4a
5b
pd.get_dummies(df2.key) ?abc012345
0.01.00.0
1.00.00.0
0.01.00.0
0.00.01.0
1.00.00.0
0.01.00.0
pd.get_dummies(df2['key'],prefix = 'key') ?key_akey_bkey_c012345
0.01.00.0
1.00.00.0
0.01.00.0
0.00.01.0
1.00.00.0
0.01.00.0
## get_dummies矩陣和原數據連接dummies = pd.get_dummies(df2['key'],prefix = 'key') pd.concat([df2['data1'],dummies],axis = 1) ?data1key_akey_bkey_c012345
00.01.00.0
11.00.00.0
20.01.00.0
30.00.01.0
41.00.00.0
50.01.00.0
df2[['data1']].join(dummies)#Series沒有join ?data1key_akey_bkey_c012345
00.01.00.0
11.00.00.0
20.01.00.0
30.00.01.0
41.00.00.0
50.01.00.0
df2[['data1']]#選出的是DataFrame ?data1012345
0
1
2
3
4
5
df2['data1']#選出的是Series 0 0 1 1 2 2 3 3 4 4 5 5 Name: data1, dtype: int64

總結

以上是生活随笔為你收集整理的python科学计算笔记(十四)pandas数据过滤、清理、转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。