熱線電話:13121318867

登錄
首頁大數據時代20個能夠有效提高 pandas數據分析效率的常用函數,附帶解釋和例子
20個能夠有效提高 pandas數據分析效率的常用函數,附帶解釋和例子
2020-08-07
收藏

pandas 是為了解決數據分析任務而創建的一種工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法,它是使Python成為強大而高效的數據分析環境的重要因素之一。今天小編就給大家分享一篇關于常見pandas函數的文章,希望對大家有所幫助。

文章來源: DeepHub IMBA

作者:P**nHub兄弟網站

pandas是一個受眾廣泛的python數據分析庫。它提供了許多函數和方法來加快數據分析過程。pandas之所以如此普遍,是因為它的功能強大、靈活簡單。本文將介紹20個常用的 Pandas 函數以及具體的示例代碼,助力你的數據分析變得更加高效。

首先,我們導入 numpypandas包。

 import numpy as np
 import pandas as pd

1. Query

我們有時需要根據條件篩選數據,一個簡單方法是query函數。為了更直觀理解這個函數,我們首先創建一個示例 dataframe。

 values_1 = np.random.randint(10, size=10)
 values_2 = np.random.randint(10, size=10)
 years = np.arange(2010,2020)
 groups = ['A','A','B','A','B','B','C','A','C','C']
 df = pd.DataFrame({'group':groups, 'year':years, 'value_1':values_1,'value_2':values_2})
 df

使用query函數的語法十分簡單:

 df.query('value_1 < value_2')

2. Insert

當我們想要在 dataframe 里增加一列數據時,默認添加在最后。當我們需要添加在任意位置,則可以使用 insert 函數。使用該函數只需要指定插入的位置、列名稱、插入的對象數據。

 # new column
 new_col = np.random.randn(10)
 # insert the new column at position 2
 df.insert(2, 'new_col', new_col)
 
 df

3. Cumsum

示例dataframe 包含3個小組的年度數據。我們可能只對年度數據感興趣,但在某些情況下,我們同樣還需要一個累計數據。Pandas提供了一個易于使用的函數來計算加和,即cumsum。

如果我們只是簡單使用cumsum函數,(A,B,C)組別將被忽略。這樣得到的累積值在某些情況下意義不大,因為我們更需要不同小組的累計數據。對于這個問題有一個非常簡單方便的解決方案,我們可以同時應用groupby和cumsum函數。

 df['cumsum_2'] = df[['value_2','group'].groupby('group').cumsum()]
 
 df

4. Sample

Sample方法允許我們從DataFrame中隨機選擇數據。當我們想從一個分布中選擇一個隨機樣本時,這個函數很有用。

 sample1 = df.sample(n=3)
 sample1

上述代碼中,我們通過指定采樣數量 n 來進行隨機選取。此外,也可以通過指定采樣比例 frac 來隨機選取數據。當 frac=0.5時,將隨機返回一般的數據。

 sample2 = df.sample(frac=0.5)
 sample2

為了獲得可重復的樣品,我們可以指定random_state參數。如果將整數值傳遞給random_state,則每次運行代碼時都將生成相同的采樣數據。

5. Where

where函數用于指定條件的數據替換。如果不指定條件,則默認替換值為 NaN。

 df['new_col'].where(df['new_col'] > 0, 0)

where函數首先根據指定條件定位目標數據,然后替換為指定的新數據。上述代碼中,where(df['new_col']>0,0)指定'new_col'列中數值大于0的所有數據為被替換對象,并且被替換為0。

重要的一點是,pandasnumpy的where函數并不完全相同。我們可以得到相同的結果,但語法存在差異。Np.where還需要指定列對象。以下兩行返回相同的結果:

 df['new_col'].where(df['new_col'] > 0, 0)
 
 np.where(df['new_col'] > 0, df['new_col'], 0)

6. Isin

在處理數據幀時,我們經常使用過濾或選擇方法。Isin是一種先進的篩選方法。例如,我們可以根據選擇列表篩選數據。

 years = ['2010','2014','2017']
 df[df.year.isin(years)]

7. Loc 和 iloc

Loc 和 iloc 函數用于選擇行或者列。

  • loc:通過標簽選擇
  • iloc:通過位置選擇

loc用于按標簽選擇數據。列的標簽是列名。對于行標簽,如果我們不分配任何特定的索引,pandas默認創建整數索引。因此,行標簽是從0開始向上的整數。與iloc一起使用的行位置也是從0開始的整數。

下述代碼實現選擇前三行前兩列的數據(iloc方式):

 df.iloc[:3,:2]

下述代碼實現選擇前三行前兩列的數據(loc方式):

 df.loc[:2,['group','year']]

注:當使用loc時,包括索引的上界,而使用iloc則不包括索引的上界。

下述代碼實現選擇"1","3","5"行、"year","value_1"列的數據(loc方式):

 df.loc[[1,3,5],['year','value_1']]

8. Pct_change

此函數用于計算一系列值的變化百分比。假設我們有一個包含[2,3,6]的序列。如果我們對這個序列應用pct_change,則返回的序列將是[NaN,0.5,1.0]。從第一個元素到第二個元素增加了50%,從第二個元素到第三個元素增加了100%。Pct_change函數用于比較元素時間序列中的變化百分比。

 df.value_1.pct_change()

9. Rank

Rank函數實現對數據進行排序。假設我們有一個包含[1,7,5,3]的序列。分配給這些值的等級為[1,4,3,2]。

 df['rank_1'] = df['value_1'].rank()
 df

10. Melt

Melt用于將維數較大的 dataframe轉換為維數較少的 dataframe。一些dataframe列中包含連續的度量或變量。在某些情況下,將這些列表示為行可能更適合我們的任務??紤]以下情況:

我們有三個不同的城市,在不同的日子進行測量。我們決定將這些日子表示為列中的行。還將有一列顯示測量值。我們可以通過使用'melt'函數輕松實現:

 df_wide.melt(id_vars=['city'])
 df

變量名和列名通常默認給出。我們也可以使用melt函數的var_name和value_name參數來指定新的列名。

11. Explode

假設數據集在一個觀測(行)中包含一個要素的多個條目,但您希望在單獨的行中分析它們。

我們想在不同的行上看到“c”的測量值,這很容易用explode來完成。

 df1.explode('measurement').reset_index(drop=True)
 df

12. Nunique

Nunique統計列或行上的唯一條目數。它在分類特征中非常有用,特別是在我們事先不知道類別數量的情況下。讓我們看看我們的初始數據:

 df.year.nunique()
 10
 df.group.nunique()
 3

我們可以直接將nunique函數應用于dataframe,并查看每列中唯一值的數量:

如果axis參數設置為1,nunique將返回每行中唯一值的數目。

13. Lookup

'lookup'可以用于根據行、列的標簽在dataframe中查找指定值。假設我們有以下數據:

我們要創建一個新列,該列顯示“person”列中每個人的得分:

 df['Person_point'] = df.lookup(df.index, df['Person'])
 df

14. Infer_objects

Pandas支持廣泛的數據類型,其中之一就是object。object包含文本或混合(數字和非數字)值。但是,如果有其他選項可用,則不建議使用對象數據類型。使用更具體的數據類型,某些操作執行得更快。例如,對于數值,我們更喜歡使用整數或浮點數據類型。

infer_objects嘗試為對象列推斷更好的數據類型??紤]以下數據:

 df2.dtypes
 A    object 
 B    object 
 C    object 
 D    object 
 dtype: object

通過上述代碼可知,現有所有的數據類型默認都是object。讓我們看看推斷的數據類型是什么:

 df2.infer_objects().dtypes
 A      int64 
 B    float64 
 C       bool 
 D     object 
 dtype: object

'infer_obejects'可能看起來微不足道,但在有很多列時作用巨大。

15. Memory_usage

Memory_usage()返回每列使用的內存量(以字節為單位)??紤]下面的數據,其中每一列有一百萬行。

 df_large = pd.DataFrame({'A': np.random.randn(1000000),
                     'B': np.random.randint(100, size=1000000)})
 df_large.shape
 (1000000, 2)

每列占用的內存:

 df_large.memory_usage()
 Index        128 
 A        8000000 
 B        8000000 
 dtype: int64

整個 dataframe 占用的內存(轉換為以MB為單位):

 df_large.memory_usage().sum() / (1024**2) #converting to megabytes
 
 15.2589111328125

16. Describe

describe函數計算數字列的基本統計信息,這些列包括計數、平均值、標準偏差、最小值和最大值、中值、第一個和第三個四分位數。因此,它提供了dataframe的統計摘要。

17. Merge

Merge()根據共同列中的值組合dataframe??紤]以下兩個數據:

我們可以基于列中的共同值合并它們。設置合并條件的參數是“on”參數。

df1和df2是基于column_a列中的共同值進行合并的,merge函數的how參數允許以不同的方式組合dataframe,如:“inner”、“outer”、“left”、“right”等。

  • inner:僅在on參數指定的列中具有相同值的行(如果未指定其它方式,則默認為 inner 方式)
  • outer:全部列數據
  • left:左一dataframe的所有列數據
  • right:右一dataframe的所有列數據

18. Select_dtypes

Select_dtypes函數根據對數據類型設置的條件返回dataframe的子集。它允許使用include和exlude參數包含或排除某些數據類型。

 df.select_dtypes(include='int64')
 df.select_dtypes(exclude='int64')

19. Replace

顧名思義,它允許替換dataframe中的值。第一個參數是要替換的值,第二個參數是新值。

 df.replace('A', 'A_1')

我們也可以在同一個字典中多次替換。

 df.replace({'A':'A_1', 'B':'B_1'})

20. Applymap

Applymap用于將一個函數應用于dataframe中的所有元素。請注意,如果操作的矢量化版本可用,那么它應該優先于applymap。例如,如果我們想將每個元素乘以一個數字,我們不需要也不應該使用applymap函數。在這種情況下,簡單的矢量化操作(例如df*4)要快得多。

然而,在某些情況下,我們可能無法選擇矢量化操作。例如,我們可以使用pandas dataframes的style屬性更改dataframe的樣式。以下代碼將負值的顏色設置為紅色:

 def color_negative_values(val):
    color = 'red' if val < 0 else 'black'
    return 'color: %s' % color

通過Applymap將上述代碼應用到dataframe:

 df3.style.applymap(color_negative_values)

作者:Soner Y?ld?r?m

deephub翻譯組:Oliver Lee

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢