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操作:
- 當axis=0時,對每列columns執行指定函數;當axis=1時,對每行row執行指定函數。
- 無論axis=0還是axis=1,其傳入指定函數的默認形式均為Series,可以通過設置raw=True傳入numpy數組。
- 對每個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個