python數據處理


1 刪除dataframe中有NAN的

這是使用字典創建DataFrame,key將作為表頭

1.1 刪除表中一行全為NAN的行

1.2 刪除表中含有任何的NAN的行

1.3 刪除表一列全為NAN的列

1.4 刪除表中含有任何的NAN的列

刪除表中某幾列

直接用data.drop

data.drop(['Probability_test', 'Kmin_test', 'Kmax_test', 'action_test'], axis=1, inplace=True)

2 pandas中對列進行上下平移(shift)

通過shift函數里面的值來控制向上還是向下平移, 缺少的值會填充NaN,groupby函數里的參數控制基於什么字段進行shift。

 2.1 上移shift(-1)

2.2 下移shift(1)

3. 批量讀取文件夾中所有文件

通過os模塊讀取文件夾的所有文件

得到的a是一個list

對每個文件進行操作

用os.path.abspath()可以獲取絕對路徑

用os.path.join(domain,info)可以獲取文件夾中每個文件的完整路徑(絕對路徑)

https://blog.csdn.net/brucewong0516/article/details/79062340

4. python tile函數

tile函數位於python模塊 numpy.lib.shape_base中,他的功能是重復某個數組。比如tile(A,n),功能是將數組A重復n次,構成一個新的數組

 

5.python中**運算符

5.1 矩陣間和np.array間的乘法運算

a和b是兩個matrices,那么a*b,就是矩陣積

numpy里面arrays遵從逐個元素的運算,所以array:d 和e的d∗e運算相當於對應的元素相乘

 5.2 **運算符

因為a是個matrix,所以a∗∗2返回的是a∗a,相當於矩陣相乘。而c是array,c∗∗2相當於,c中的元素逐個求平方。

 

 

 

 

6 min(0),max(0)的用法

7 分組求平均值(groupby)

依據Kmin,Kmax,Probability,action來計算reward的平均值

8 數據分組和聚合運算

pandas對象中的數據會根據你所提供的一個或多個鍵被拆分為多組,拆分操作是在對象的特定軸上執行的(groupby分組默認是在axis=0上進行分組的),然后將一個函數應用到各個分組並產生一個新值,最后所有這些函數的執行結果會被合並到最終的結果對象中。

8.1 groupby分組

這樣生成了一個groupby對象,實際上還未進行任何計算,可對其調用方法進行計算

下面計算平均值

1.以key1為依據,對data1進行分組

求得平均值

2.可以將列名直接當作分組對象,分組中,數值列會被聚合,非數值列會從結果中排除

 原始數據:

可以看到原來數據里面的key2是非數值列,被排除掉了

3.以多列分組求平均值

以key1和key2分組

4.使用groupby的size方法

可以返回一個含有分組大小的series

按key1的值和key2的值分組,並統計個數

原始數據:

首先根據key1,看a有三個,再根據key2排除了a two這個組合,剩下兩個a one

 8.2 對分組進行迭代

  • groupby對象支持迭代,可以產生一組二元數組(由分組名稱和數據塊構成)

  •  對於多重鍵的情況,元組的第一個元素將會是由鍵值組成的元組

  •  groupby分組默認是在axis=0上進行分組的,通過設置也可以在其他軸上進行分組

 8.3 對部分列進行聚合

 8.4 數據聚合

對於聚合,一般指的是能夠從數組產生的標量值的數據轉換過程,常見的聚合運算都有相關的統計函數快速實現,當然也可以自定義聚合運算

要使用自己的定義的聚合函數,需將其傳入aggregate或agg方法即可

此處,將自定義的聚合函數傳入agg中

8.5 分組運算和轉換

聚合僅是分組運算的一種,它是數據轉換的一個特例,本節介紹transform和apply方法,他們能夠執行更多其他的分組運算

以下是為一個DataFrame添加一個用於存放各索引組平均值的列,利用了先聚合再合並

用merge合並

實際上可以對DataFrame進行transform方法,對比一下下面兩種的區別,transform會將一個函數應用到各個分組

參考:https://www.cnblogs.com/splended/p/5278078.html

9 統計每個標簽出現的次數

10 生成pandas數據

要生成pandas數據,先將其轉換成字典,再通過pd.DataFrame(dict)方式轉成pandas數據

lenses.txt數據:

 11 fit()函數不能接收string類型數據

string數據序列化

可以看到報錯,ValueError:could not convert string to float:'young'

因為在fit()函數不能接收string類型的數據,通過打印的信息可以看到,數據都是string類型的。在使用fit()函數之前,我們需要對數據集進行編碼,這里可以使用兩種方法:

LabelEncoder:將字符串轉換為增量值

OneHotEncoder:使用One-of-K算法將字符串轉換為整數

為了對string類型的數據序列化,需要先生成pandas數據,這樣方便我們的序列化工作。這里我使用的方法是,原始數據->字典->pandas數據

數據序列化(需要導入LabelEncoder)

 

運行結果:

 

 

12 將兩個含有字符串的集合取並集

13 reduce()函數會對參數序列中元素進行累積

函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最后得到一個結果。

14 拉普拉斯平滑和下溢出

利用貝葉斯分類器對文檔進行分類時,要計算多個概率的乘積以獲得文檔屬於某個類別的概率,即計算p(w0|1)p(w1|1)p(w2|1)。如果其中有一個概率值為0,那么最后的成績也為0。

從上圖可以看出,在計算的時候已經出現了概率為0的情況。如果新實例文本,包含這種概率為0的分詞,那么最終的文本屬於某個類別的概率也就是0了。顯然,這樣是不合理的,為了降低這種影響,可以將所有詞的出現數初始化為1,並將分母初始化為2。這種做法就叫做拉普拉斯平滑(Laplace Smoothing)又被稱為加1平滑,是比較常用的平滑方法,它就是為了解決0概率問題。

除此之外,另外一個遇到的問題就是下溢出,這是由於太多很小的數相乘造成的。學過數學的人都知道,兩個小數相乘,越乘越小,這樣就造成了下溢出。在程序中,在相應小數位置進行四舍五入,計算結果可能就變成0了。為了解決這個問題,對乘積結果取自然對數。通過求對數可以避免下溢出或者浮點數舍入導致的錯誤。同時,采用自然對數進行處理不會有任何損失。下圖給出函數f(x)和ln(f(x))的曲線。

沒有進行拉普拉斯平滑和下溢出操作之前

進行了拉普拉斯平滑和取對數防止下溢出操作后的

15 從txt文件中讀取字符串,並將字符串轉換為字符列表

正則表達式中,+代表重復1次至多次,*表示重復0次到多次 所以在切分的時候,如果正則表達是為r'\W*',那就會見到非數字字母 零次或者多次就會切分 比如['ab cd ede?']切分后就是['a','b',' ','c','d',' ',' ','e','d',e','?'] 再加上后面的的語句return [ i for i in list if len(i)>2],因為每個字符串的長度都小於2,自然返回空集 把正則表達式改為r‘\W+’就好啦

切分之后的

16 文本向量化

生成的returnVec長度與vocabList長度相同,遍歷inputSet中的單詞,並查找是否在詞匯列表vocabList出現,出現的把該位置置為1,未出現的就是之前初始化0

17 從50個郵件中隨機選出40個作為訓練集,10個作為測試集

18 sorted排序

當待排序列表的元素由多字段構成時,我們可以通過sorted(iterable,key,reverse)的參數key來制定我們根據哪個字段對列表元素進行排序。

  key=lambda 元素: 元素[字段索引]

  例如:想對元素第二個字段排序,則

  key=lambda y: y[1] 備注:這里y可以是任意字母,等同key=lambda x: x[1

對字典進行排序

根據鍵的值進行倒序排序

首先運用items()獲取字典的鍵值tuple列表,通過key來設定根據哪個字段進行排序

總之,排序,是要對列表排序,如果是對字典排序,需要將字典轉換成鍵值對tuple列表的形式之后,再進行排序。

19 壓縮與解壓縮

注意要將數據打亂

20 if not

if not 就是一個判斷語句,not 表示 非,

寫成這個樣子可能就理解了:

if not cond:

do_something()

意思就是如果 cond 為 “假值” (False,None,"" 等)時,執行分支里的語句。如果學過別的語言,比如 C\C++ 等,上面的語句等價於:

if !cond {

    do_something();

}

使用if not x這種寫法的前提是:必須清楚x等於None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元組()時對你的判斷沒有影響才行。

在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元組()都相當於False。

21 Numpy的矩陣索引和array數組索引

矩陣索引使用[i,j]方式,數組索引使用[i][j]

22 getA()函數的作用

getA()函數與mat()函數的功能相反,是將一個numpy矩陣轉換為數組

23 梯度上升算法原理解析

m為行數,代表有多少個樣本;n為列數,代表有多少個特征。

n決定了weights的個數

24 Numpy中np.append()

numpy.append(arr, values, axis=None)

意思就是,將arr和values會重新組合成新的數組,作為返回值。axis是一個可選的值。

25 np.c_[xx.ravel(), y.ravel()]

np.c_[],組成矩陣(xx,yy對應位置配對)

xx.ravel()拉直,降低xx的維度,變成一行n列

26 np.vstack(x).reshape(-1,2)和np.squeeze(Y_c)

26.1 np.vstack(x)按照行順序把數組垂直地堆疊起來

reshape(-1,2)n行2列(用-1表示n行)

26.2 np.squeeze(Y_c)

將向量數組轉換為秩為1的數組

 

 27 tf.reduce_mean(x, axis)

表示求取矩陣或張量指定維度的平均值。若不指定第二個參數,則在所有元素中取平均值;若指定第二個參數為0, 則在第一維元素上取平均值,即每一列求平均值;若指定第二個參數為1,則在第二維元素上取平均值,即每一行求平均值。

 

 28 os.path.join()

表示把參數字符串按照路徑命名規則拼接

29 np.sign

就是大於0的返回1.0

小於0的返回-1.0

等於0的返回0.0

30 Python中flatten, matrix.A用法

flatten的作用:返回一個折疊成一維的數組。

但是該函數只能適用於numpy對象,即array或者mat

你的xMat折疊成一維數組,而且是按A的方式,進行折疊,然后[0]是取第一個元素

a是個矩陣或者數組,a.flatten()就是把a降到一維,默認是按橫的方向降

此時的a是個矩陣,降維后還是個矩陣,矩陣.A(等效於矩陣.getA())變成了數組,A[0]就是數組里的第一個元素

31 加載文本中數據的方法

當從文本中讀取一行數據時候,數據的形式是這樣的

這樣的數據格式不符合要求,可以使用map方法

 

使用map方法

得到的數據形式:

32 Python中的size, shape, len, count

33 Python中列表,numpy中數組和矩陣的區別

Python中沒有數組,只有元組和列表。

Python列表與numpy數組的區別

矩陣

數組

矩陣

數組

34 np.nonzero

np.nonzero(a)函數的作用:

將對矩陣a的所有非零元素, 分別安裝兩個維度, 一次返回其在各維度上的目錄值。

因為矩陣只有一個非0值,在第0行,第0列

因為矩陣a只有兩個非零值, 在第0行、第0列,和第1行、第0列。所以結果元組中,第一個行維度數據為(0,1) 元組第二個列維度都為(0,0)。

35 矩陣轉為數組.A

 

36 將數組或矩陣轉換成列表tolist()

37 Numpy在reshape函數中使用-1

Numpy 允許我們根據給定的新形狀重塑矩陣,新形狀應該和原形狀兼容。有意思的是,我們可以將新形狀中的一個參數賦值為-1。這僅僅表明它是一個未知的維度,我們希望 Numpy 來算出這個未知的維度應該是多少:Numpy 將通過查看數組的長度和剩余維度來確保它滿足上述標准。讓我們來看以下例子:

總而言之,當試圖對一個張量進行 reshape 操作時,新的形狀必須包含與舊的形狀相同數量的元素,這意味着兩個形狀的維度乘積必須相等。當使用 -1 參數時,與-1 相對應的維數將是原始數組的維數除以新形狀中已給出維數的乘積,以便維持相同數量的元素。

38 Numpy的argpartion函數:找到N個最大值的索引並返回N個值

Numpy 的 argpartion 函數可以高效地找到 N 個最大值的索引並返回 N 個值。在給出索引后,我們可以根據需要進行值排序。

39 Numpy中setdiff1d函數找到僅在A數組中有而B數組沒有的元素

我們可以使用 Numpy extract () 函數從數組中提取符合條件的特定元素。

例子:模3

41 Numpy中clip函數是數組中的值保持在一定區間內

在很多數據處理和算法中(比如強化學習中的 PPO),我們需要使得所有的值保持在一個上下限區間內。Numpy 內置的 Clip 函數可以解決這個問題。Numpy clip () 函數用於對數組中的值進行限制。給定一個區間范圍,區間范圍外的值將被截斷到區間的邊界上。例如,如果指定的區間是 [-1,1],小於-1 的值將變為-1,而大於 1 的值將變為 1。

示例1:限制數組中的最小值為 2,最大值為 6

示例2:限制數組中的最小值為2,最大值為5

42 數組切片[:5:-1]的含義

a[2:7:2]表示從索引2開始到索引7停止,間隔為2

a[:5:-1],-1反轉

冒號 : 的解釋:如果只放置一個參數,如 [2],將返回與該索引相對應的單個元素。如果為 [2:],表示從該索引開始以后的所有項都將被提取。如果使用了兩個參數,如 [2:7],那么則提取兩個索引(不包括停止索引)之間的項。

43 time模塊,計算當前時間和時間差

43.1 計算當前時間戳

https://blog.csdn.net/liuweiyuxiang/article/details/71075306

43.2 計算時間差

往前推5分鍾

可以5*60=360s,計算時間戳的時候,再*1000轉成毫秒級的

44 Numpy中用布爾值來替換值

Numpy可以運用布爾值來替換值

在數組中

在矩陣中

可以看到替換有個很有用的地方,就是可以替換那些空值

如,我們現在讀取一個字符矩陣,其中有一個控制,其中的控制我們很有必要把它替換成其他值,可以用數據的平均值或者直接把它刪除。

例:將空值替換成“0”的操作

45 Groupby詳解

在日常的數據分析中,經常需要將數據根據某個(多個)字段划分為不同的群體(group)進行分析,如電商領域將全國的總銷售額根據省份進行划分,分析各省銷售額的變化情況,社交領域將用戶根據畫像(性別、年齡)進行細分,研究用戶的使用情況和偏好等。在Pandas中,上述的數據處理操作主要運用groupby完成,這篇文章就介紹一下groupby的基本原理及對應的agg、transform和apply操作。

為了后續圖解的方便,采用模擬生成的10個樣本數據,代碼和數據如下:

 

45.1 Groupby的基本原理

在Pandas中,實現分組操作的代碼很簡單,僅需一行代碼,在這里,將上面的數據集按照company字段進行划分:

將上述代碼輸入ipython后,會得到一個DataFrameGroupBy對象

那這個生成的DataFrameGroupBy是啥呢?對data進行了groupby后發生了什么?ipython所返回的結果是其內存地址,並不利於直觀地理解,為了看看group內部究竟是什么,這里把group轉換成list的形式來看一看:

轉換成列表的形式后,可以看到,列表由三個元組組成,每個元組中,第一個元素是組別(這里是按照company進行分組,所以最后分為了A,B,C),第二個元素的是對應組別下的DataFrame,整個過程可以圖解如下:

總結來說,groupby的過程就是將原有的DataFrame按照groupby的字段(這里是company),划分為若干個分組DataFrame,被分為多少個組就有多少個分組DataFrame。所以說,在groupby之后的一系列操作(如agg、apply等),均是基於分組DataFrame的操作。理解了這點,也就基本摸清了Pandas中groupby操作的主要原理。下面來講講groupby之后的常見操作。

45.2 agg分組聚合

聚合操作是groupby后常見的操作,會寫SQL的朋友對此應該是非常熟悉了。聚合操作可以用來求和、均值、最大值、最小值等,下面的表格列出了Pandas中常見的聚合操作。

針對樣例數據集,如果我想計算不同公司員工的平均年齡和平均薪水,可以按照下方的代碼進行:

如果想對針對不同的列求不同的值,比如要計算不同公司員工的平均年齡以及薪水的中位數,可以利用字典指定進行聚合操作:

45.3 transform

transform是一種什么數據操作?和agg有什么區別呢?為了更好地理解transform和agg的不同,下面從實際的應用場景出發進行對比。

在上面的agg中,我們學會了如何求不同公司員工的平均薪水,如果現在需要在原數據集中新增一列avg_salary,代表員工所在的公司的平均薪水(相同公司的員工具有一樣的平均薪水),該怎么實現呢?如果按照正常的步驟來計算,需要先求得不同公司的平均薪水,然后按照員工和公司的對應關系填充到對應的位置,不用transform的話,實現代碼如下:

如果使用transform的話,僅需要一行代碼:

還是以圖解的方式來看看進行groupby后transform的實現過程(為了更直觀展示,圖中加入了company列,實際按照上面的代碼只有salary列):

圖中的大方框是transform和agg所不一樣的地方,對agg而言,會計算得到A,B,C公司對應的均值並直接返回,但對transform而言,則會對每一條數據求得相應的結果,同一組內的樣本會有相同的值,組內求完均值后會按照原索引的順序返回結果,如果有不理解的可以拿這張圖和agg那張對比一下。

45.4 apply

apply應該是大家的老朋友了,它相比agg和transform而言更加靈活,能夠傳入任意自定義的函數,實現復雜的數據操作。在Pandas數據處理三板斧,你會幾板?中,介紹了apply的使用,那在groupby后使用apply和之前所介紹的有什么區別呢?

區別是有的,但是整個實現原理是基本一致的。兩者的區別在於,對於groupby后的apply,以分組后的分組DataFrame作為參數傳入指定函數的,基本操作單位是DataFrame,而之前介紹的apply的基本操作單位是Series。還是以一個案例來介紹groupby后的apply用法。

假設我現在需要獲取各個公司年齡最大的員工的數據,該怎么實現呢?可以用以下代碼實現:

 

46 Pandas數據處理三板斧,map、apply和applymap

46.1 Series數據處理

46.1.1 map

數據集如下所示,各列分別代表身高、體重、是否吸煙、性別、年齡和膚色。

如果需要把數據集中gender列的男替換為1,女替換為0,怎么做呢?絕對不是用for循環實現!!!使用Series.map()可以很容易做到,最少僅需一行代碼。

兩種方法實現

  • 使用字典映射

  •  使用函數

那map在實際過程中是怎么運行的呢?請看下面的圖解(為了方便展示,僅截取了前10條數據)

 

不論是利用字典還是函數進行映射,map方法都是把對應的數據逐個當作參數傳入到字典或函數中,得到映射后的值。

46.1.2 apply

同時Series對象還有apply方法,apply方法的作用原理和map方法類似,區別在於apply能夠傳入功能更為復雜的函數。怎么理解呢?一起看看下面的例子。

假設在數據統計的過程中,年齡age列有較大誤差,需要對其進行調整(加上或減去一個值),由於這個加上或減去的值未知,故在定義函數時,需要加多一個參數bias,此時用map方法是操作不了的(傳入map的函數只能接收一個參數),apply方法則可以解決這個問題。

可以看到age列都減了3,當然,這里只是簡單舉了個例子,當需要進行復雜處理時,更能體現apply的作用。

總而言之,對於Series而言,map可以解決絕大多數的數據處理需求,但如果需要使用較為復雜的函數,則需要用到apply方法。

46.2 Serie和DataFrame的區別

46.3 DataFrame數據處理

46.3.1 apply

對DataFrame而言,apply是非常重要的數據處理方法,它可以接收各種各樣的函數(Python內置的或自定義的),處理方式很靈活,下面通過幾個例子來看看apply的具體使用及其原理。

在進行具體介紹之前,首先需要介紹一下DataFrame中axis的概念,在DataFrame對象的大多數方法中,都會有axis這個參數,它控制了你指定的操作是沿着0軸還是1軸進行。axis=0代表操作對列columns進行,axis=1代表操作對行row進行,如下圖所示。

如果還不是很了解,沒關系,下面會分別對apply沿着0軸以及1軸的操作進行講解,繼續往下走。

假設現在需要對data中的數值列分別進行取對數和求和的操作,這時可以用apply進行相應的操作,因為是對列進行操作,所以需要指定axis=0,使用下面的兩行代碼可以很輕松地解決我們的問題。

實現的方式很簡單,但調用apply時究竟發生了什么呢?過程是怎么實現的?還是通過圖解的方式來一探究竟。(取前五條數據為例)

 

當沿着軸0(axis=0)進行操作時,會將各列(columns)默認以Series的形式作為參數,傳入到你指定的操作函數中,操作后合並並返回相應的結果。

那如果在實際使用中需要按行進行操作(axis=1),那整個過程又是怎么實現的呢?

在數據集中,有身高和體重的數據,所以根據這個,我們可以計算每個人的BMI指數(體檢時常用的指標,衡量人體肥胖程度和是否健康的重要標准),計算公式是:體重指數BMI=體重/身高的平方(國際單位kg/㎡),因為需要對每個樣本進行操作,這里使用axis=1的apply進行操作,代碼如下:

還是用圖解的方式來看看這個過程到底是怎么實現的(以前5條數據為例)。

當apply設置了axis=1對行進行操作時,會默認將每一行數據以Series的形式(Series的索引為列名)傳入指定函數,返回相應的結果。

總結一下對DataFrame的apply操作:

  1. 當axis=0時,對每列columns執行指定函數;當axis=1時,對每行row執行指定函數。
  2. 無論axis=0還是axis=1,其傳入指定函數的默認形式均為Series,可以通過設置raw=True傳入numpy數組。
  3. 對每個Series執行結果后,會將結果整合在一起返回(若想有返回值,定義函數時需要return相應的值)

當然,DataFrame的apply和Series的apply一樣,也能接收更復雜的函數,如傳入參數等,實現原理是一樣的,具體用法詳見官方文檔。

46.3.2 applymap

applymap的用法比較簡單,會對DataFrame中的每個單元格執行指定函數的操作,雖然用途不如apply廣泛,但在某些場合下還是比較有用的,如下面這個例子。

為了演示的方便,新生成一個DataFrame

47 pickle

47.1 pickle保存

pickle 是一個 python 中, 壓縮/保存/提取 文件的模塊. 最一般的使用方式非常簡單. 比如下面就是壓縮並保存一個字典的方式. 字典和列表都是能被保存的.

wb 是以寫的形式打開 ‘pickle_example.pickle’ 這個文件, 然后 pickle.dump 你要保存的東西去這個打開的 file. 最后關閉 file 你就會發現你的文件目錄里多了一個 ‘pickle_example.pickle’文件, 這就是那個字典了

47.2 pickle提取

提取的時候相對簡單點, 同樣我們以讀的形式打開那個文件, 然后 load 進一個 python 的變量.

48 Python字典的get()用法

作用

Python中的字典(Dictionary)是以鍵值對的形式存儲數據的,get()方法可以返回指定鍵的值,如果該鍵不存在的話,返回默認值。

語法

dict.get(key, default=None)

參數

key:需要查找的鍵。

default:如果查找的鍵不存在的話,返回default的值。默認為None。

和dict[key]的區別

dict.get(key)和dict[key]在key值存在的情況下,都能得到對應的鍵值。但是當使用dict[key]時,key必須要存在,否則會報錯。但是dict.get[key]中的key可以不存在,因為get方法有一個默認的參數None,當key不存在的時候,返回None。

49 統計一個數組的詞頻,並取前10個

 


免責聲明!

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



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