30 個小例子幫你快速掌握Pandas
↑↑↑點擊上方藍字,回復(fù)資料,10個G的驚喜
作者:Soner Y?ld?r?m
鏈接:https://towardsdatascience.com/30-examples-to-master-pandas-f8a2da751fa4
Pandas是Python最知名的數(shù)據(jù)分析和處理庫。它提供了許多的函數(shù)和方法,可加快數(shù)據(jù)分析和預(yù)處理步驟。今天介紹的這些示例將涵蓋您可能在典型的數(shù)據(jù)分析過程中使用的幾乎所有函數(shù)和方法。
讀取數(shù)據(jù)集
本次演示使用Kaggle上提供的客戶流失數(shù)據(jù)集[1]。
讓我們從將csv文件讀取到pandas DataFrame開始。
import?numpy?as?np
import?pandas?as?pd
df?=?pd.read_csv("/data/churn.csv")
df.shape
---
(10000,14)
df.columns
---
Index(['RowNumber',?'CustomerId',?'Surname',
'CreditScore',?'Geography',?'Gender',?'Age',
'Tenure',?'Balance',?'NumOfProducts',?
'HasCrCard','IsActiveMember','EstimatedSalary',?
'Exited'],?dtype='object')
1.刪除列
df.drop(['RowNumber',?'CustomerId',
'Surname',?'CreditScore'],?axis=1,
inplace=True)
df.shape
---
(10000,10)
axis參數(shù)設(shè)置為1表示刪除列,0表示行。inplace參數(shù)設(shè)置為True以保存更改。我們刪除了4列,因此列數(shù)從14減少到10。
2.讀取時選擇特定的列
我們只打算讀取csv文件中的某些列。讀取時,列列表將傳遞給usecols參數(shù)。如果您事先知道列名,則比以后刪除更好。
df_spec?=?pd.read_csv("/data/churn.csv",?
usecols=['Gender',?'Age',?'Tenure',?'Balance'])
df_spec.head()

3.讀取DataFrame的一部分行
read_csv函數(shù)允許按行讀取DataFrame的一部分。有兩種選擇。第一個是讀取前n行。
df_partial?=?pd.read_csv("/data/churn.csv",
nrows=500)
df_partial.shape
---
(500,14)
使用nrows參數(shù),我們創(chuàng)建了一個包含csv文件的前500行的DataFrame。
我們還可以使用skiprows參數(shù)從文件末尾選擇行。Skiprows = 5000表示在讀取csv文件時我們將跳過前5000行。
也可以把nrows和skiprows結(jié)合使用,就相當于MySQL里的limit 500 offset 5000
4.抽樣
創(chuàng)建DataFrame后,我們可能希望抽取一個小樣本以便于進行工作。我們可以使用n參數(shù)或frac參數(shù)來確定樣本大小。
n:樣本中的行數(shù) frac:樣本大小與整個DataFrame大小的比率
df_sample?=?df.sample(n=1000)??
df_sample.shape??
(1000,10)df_sample2?=?df.sample(frac=0.1)??
df_sample2.shape
---
(1000,10)
5.缺失值檢查
isna函數(shù)用于確定DataFrame中的缺失值。通過將isna與sum函數(shù)一起使用,我們可以看到每列中缺失值的數(shù)量。
df.isna().sum()

6.使用loc和iloc添加缺失值
我正在做這個例子來練習(xí)loc和iloc。這些方法根據(jù)索引或標簽選擇行和列。
loc:帶標簽選擇 iloc:用索引選擇
先創(chuàng)建20個隨機indices。
missing_index?=?np.random.randint(10000,size?=?20)
接下來將某些值更改為np.nan(缺失值)。
df.loc?[missing_index,['Balance','Geography']]?=?np.nan
Balance和Geography列中缺少20個值。讓我們做另一個使用索引而不是標簽的示例。
df.iloc?[missing_index,-1]?=?np.nan
"-1"是最后一列Exit的索引。
盡管我們對loc和iloc使用了不同的列表示形式,但行值沒有改變。原因是我們使用數(shù)字索引標簽。因此,行的標簽和索引都相同。
缺失值的數(shù)量已更改:

7.填充缺失值
fillna函數(shù)用于填充缺失值。它提供了許多選項。我們可以使用特定值,聚合函數(shù)(例如均值)或上一個或下一個值。
對于Geography列,我將使用最常見的值。

mode?=?df['Geography'].value_counts().index[0]??
df['Geography'].fillna(value=mode,?inplace=True)

同樣,對于Balance列,我將使用列的均值替換缺失值。
avg?=?df['Balance'].mean()??
df['Balance'].fillna(value=avg,?inplace=True)
fillna函數(shù)的method參數(shù)可用于根據(jù)列中的上一個或下一個值填充缺失值(例如method ='ffill')。這對于順序數(shù)據(jù)(例如時間序列)非常有用。
8.刪除缺失值
處理缺失值的另一種方法是刪除它們?!耙淹顺觥绷兄腥匀鄙僦?。以下代碼將刪除缺少任何值的行。
df.dropna(axis=0,?how='any',?inplace=True)
axis = 1用于刪除缺少值的列。我們還可以為列或行具有的非缺失值的數(shù)量設(shè)置閾值。例如,thresh = 5表示一行必須具有至少5個不可丟失的非丟失值。缺失值小于或等于4的行將被刪除。
DataFrame現(xiàn)在沒有任何缺失值。
df.isna().sum().sum()
---
0
9.根據(jù)條件選擇行
在某些情況下,我們需要適合某些條件的觀察值(即行)。例如,下面的代碼將選擇居住在法國并且已經(jīng)流失的客戶。
france_churn?=?df[(df.Geography?==?'France')?\
&?(df.Exited?==?1)]
france_churn.Geography.value_counts()??
---
France????808
10.用查詢描述條件
查詢函數(shù)提供了一種更靈活的條件傳遞方式。我們可以用字符串描述它們。
df2?=?df.query('80000?)
讓我們通過繪制Balance列的直方圖來確認結(jié)果。
df2['Balance'].plot(kind='hist',?figsize=(8,5))

11.用isin描述條件
條件可能有幾個值。在這種情況下,最好使用isin方法,而不是單獨寫入值。
我們只傳遞期望值的列表。
df[df['Tenure'].isin([4,6,9,10])][:3]

12.groupby函數(shù)
Pandas Groupby函數(shù)是一種通用且易于使用的函數(shù),有助于獲得數(shù)據(jù)概覽。它使探索數(shù)據(jù)集和揭示變量之間的潛在關(guān)系變得更加容易。
我們將為groupby函數(shù)寫幾個例子。讓我們從一個簡單的開始。下面的代碼將根據(jù)地理位置和性別的組合對行進行分組,然后為我們提供每組的平均流失率。
df[['Geography','Gender','Exited']]\
.groupby(['Geography','Gender']).mean()

13.通過groupby應(yīng)用多個聚合函數(shù)
agg函數(shù)允許在組上應(yīng)用多個聚合函數(shù)。函數(shù)列表作為參數(shù)傳遞。
df[['Geography','Gender','Exited']].\groupby(['Geography','Gender']).agg(['mean','count'])
我們可以看到每組中觀察值(行)的數(shù)量和平均流失率。
14.將不同的匯總函數(shù)應(yīng)用于不同的組
我們不必對所有列都應(yīng)用相同的函數(shù)。例如,我們可能希望查看每個國家/地區(qū)的平均余額和流失的客戶總數(shù)。
我們將傳遞一個字典,該字典指示哪些函數(shù)將應(yīng)用于哪些列。
df_summary?=?df[['Geography','Exited','Balance']]\
.groupby('Geography')\
.agg({'Exited':'sum',?'Balance':'mean'})
df_summary.rename(columns={'Exited':'#?of?churned?customers',
'Balance':'Average?Balance?of?Customers'},inplace=True)
df_summary

我還重命名了這些列。
NamedAgg函數(shù)允許重命名聚合中的列。語法如下:
df_summary?=?df[['Geography','Exited','Balance']].groupby('Geography')\??
.agg(??
?Number_of_churned_customers?=?pd.NamedAgg('Exited',?'Sum'),??
?Average_balance_of_customers?=?pd.NamedAgg('Balance',?'Mean')??
)
15.重置索引
您可能已經(jīng)注意到,groupby返回的DataFrame的索引由組名組成。我們可以通過重置索引來更改它。
df_new?=?df[['Geography','Exited','Balance']]\??
.groupby(['Geography','Exited']).mean().reset_index()
df_new

如果我們將groupby函數(shù)的as_index參數(shù)設(shè)置為False,則組名將不會用作索引。
16.帶刪除的重置索引
在某些情況下,我們需要重置索引并同時刪除原始索引。考慮從DataFrame中抽取樣本的情況。該示例將保留原始DataFrame的索引,因此我們要重置它。
df[['Geography','Exited','Balance']]\
.sample(n=6).reset_index()

重設(shè)索引,但原始索引保留為新列。我們可以在重置索引時將其刪除。
df[['Geography','Exited','Balance']]\??
.sample(n=6).reset_index(drop=True)

17.設(shè)置特定的列作為索引
我們可以將DataFrame中的任何列設(shè)置為索引。
df_new.set_index('Geography')

18.插入新列
我們可以向DataFrame添加新列,如下所示:
group?=?np.random.randint(10,?size=6)??
df_new['Group']?=?group
df_new

但新列將添加在末尾。如果要將新列放在特定位置,則可以使用插入函數(shù)。
df_new.insert(0,?'Group',?group)
df_new

第一個參數(shù)是位置的索引,第二個參數(shù)是列的名稱,第三個參數(shù)是值。
19.where函數(shù)
它用于根據(jù)條件替換行或列中的值。默認替換值是NaN,但我們也可以指定要替換的值。
考慮上一步(df_new)中的DataFrame。我們希望將小于6的客戶的Balance設(shè)置為0。
df_new['Balance']?=?df_new['Balance']\
.where(df_new['Group']?>=?6,?0)
df_new

符合指定條件的值將保持不變,而其他值將替換為指定值。
20.排名函數(shù)
它為這些值分配一個等級。讓我們創(chuàng)建一個根據(jù)客戶余額對客戶進行排名的列。
df_new['rank']?=?df_new['Balance']\
.rank(method='first',?ascending=False).astype('int')
df_new

method參數(shù)指定如何處理具有相同值的行。first表示根據(jù)它們在數(shù)組(即列)中的順序?qū)ζ溥M行排名。
21.列中唯一值的數(shù)量
使用分類變量時,它很方便。我們可能需要檢查唯一類別的數(shù)量。
我們可以檢查由value counts函數(shù)返回的序列的大小,也可以使用nunique函數(shù)。

22.內(nèi)存使用
只需通過memory_usage函數(shù)即可完成。

這些值顯示以字節(jié)為單位使用了多少內(nèi)存。
23.分類數(shù)據(jù)類型
默認情況下,分類數(shù)據(jù)與對象數(shù)據(jù)類型一起存儲。但是,這可能會導(dǎo)致不必要的內(nèi)存使用,尤其是當分類變量的基數(shù)較低時。
低基數(shù)意味著與行數(shù)相比,一列具有很少的唯一值。例如,Geography列具有3個唯一值和10000行。
我們可以通過將其數(shù)據(jù)類型更改為category來節(jié)省內(nèi)存。
df['Geography']?=?df['Geography'].astype('category')

Geography列的內(nèi)存消耗減少了近8倍。
24.替換值
替換函數(shù)可用于替換DataFrame中的值。

第一個參數(shù)是要替換的值,第二個參數(shù)是新值。
我們可以使用字典進行多次替換。

25.繪制直方圖
Pandas不是數(shù)據(jù)可視化庫,但用它創(chuàng)建一些基本圖形還是非常簡單的。
我發(fā)現(xiàn)使用Pandas創(chuàng)建基本圖比使用其他數(shù)據(jù)可視化庫更容易。
讓我們創(chuàng)建Balance列的直方圖。
df['Balance'].plot(kind='hist',?figsize=(10,6),???
title='Customer?Balance')

由于Pandas不是數(shù)據(jù)可視化庫,因此我不想詳細介紹繪圖。但是,Pandas 繪圖[2]函數(shù)能夠創(chuàng)建許多不同的圖形,例如直線,條形圖,kde,面積,散點圖等等。
26.減少浮點數(shù)的小數(shù)點位數(shù)
Pandas的浮點數(shù)可能會顯示過多的小數(shù)點。我們可以使用舍入函數(shù)輕松調(diào)整它。
df_new.round(1)#所需的小數(shù)位數(shù)

27.更改顯示選項
無需每次都手動調(diào)整顯示選項,我們可以更改各種參數(shù)的默認顯示選項。
get_option:返回當前選項是什么 set_option:更改選項
讓我們將小數(shù)點的顯示選項更改為2。
pd.set_option("display.precision",?2)

您可能需要更改的其他一些選項是:
max_colwidth:列中顯示的最大字符數(shù) max_columns:要顯示的最大列數(shù) max_rows:要顯示的最大行數(shù)
28.計算列中的百分比變化
pct_change用于計算一系列值中的百分比變化。在計算元素的時間序列或順序數(shù)組中的變化百分比時很有用。

從第一元素(4)到第二元素(5)的變化為%25,因此第二個值為0.25。
29.根據(jù)字符串過濾
我們可能需要根據(jù)文本數(shù)據(jù)(例如客戶名稱)過濾觀察結(jié)果(行)。我已經(jīng)將虛構(gòu)名稱添加到df_new DataFrame中。

讓我們選擇客戶名稱以Mi開頭的行。
我們將使用str訪問器的startswith方法。
df_new[df_new.Names.str.startswith('Mi')]

endswith函數(shù)根據(jù)字符串末尾的字符進行相同的過濾。
Pandas可以對字符串進行很多操作。
30.樣式化DataFrame
我們可以通過使用Style屬性來實現(xiàn)此目的,該屬性返回一個styler對象。它提供了許多用于格式化和顯示DataFrame的選項。例如,我們可以突出顯示最小值或最大值。
它還允許應(yīng)用自定義樣式函數(shù)。
df_new.style.highlight_max(axis?=?0,
color?='darkgreen')

參考資料
客戶流失數(shù)據(jù)集: https://www.kaggle.com/shubh0799/churn-modelling
[2]Pandas 繪圖: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html
機器學(xué)習(xí)從 入 門 到 精 通 路 線 圖
【干貨】統(tǒng) 計 學(xué) × 數(shù) 據(jù) 分 析


