frac函数_20个能够有效提高 Pandas数据分析效率的常用函数,附带解释和例子
Pandas是一個(gè)受眾廣泛的python數(shù)據(jù)分析庫。它提供了許多函數(shù)和方法來加快數(shù)據(jù)分析過程。pandas之所以如此普遍,是因?yàn)樗墓δ軓?qiáng)大、靈活簡(jiǎn)單。
本文將介紹20個(gè)常用的 Pandas 函數(shù)以及具體的示例代碼,助力你的數(shù)據(jù)分析變得更加高效。
首先,我們導(dǎo)入 numpy和 pandas包。
import numpy as np
import pandas as pd
1. Query
我們有時(shí)需要根據(jù)條件篩選數(shù)據(jù),一個(gè)簡(jiǎn)單方法是query函數(shù)。
為了更直觀理解這個(gè)函數(shù),我們首先創(chuàng)建一個(gè)示例 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函數(shù)的語法十分簡(jiǎn)單:
df.query('value_1 < value_2')
2. Insert
當(dāng)我們想要在 dataframe 里增加一列數(shù)據(jù)時(shí),默認(rèn)添加在最后。當(dāng)我們需要添加在任意位置,則可以使用 insert 函數(shù)。
使用該函數(shù)只需要指定插入的位置、列名稱、插入的對(duì)象數(shù)據(jù)。
# 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個(gè)小組的年度數(shù)據(jù)。我們可能只對(duì)年度數(shù)據(jù)感興趣,但在某些情況下,我們同樣還需要一個(gè)累計(jì)數(shù)據(jù)。Pandas提供了一個(gè)易于使用的函數(shù)來計(jì)算加和,即cumsum。
如果我們只是簡(jiǎn)單使用cumsum函數(shù),(A,B,C)組別將被忽略。這樣得到的累積值在某些情況下意義不大,因?yàn)槲覀兏枰煌〗M的累計(jì)數(shù)據(jù)。對(duì)于這個(gè)問題有一個(gè)非常簡(jiǎn)單方便的解決方案,我們可以同時(shí)應(yīng)用groupby和cumsum函數(shù)。
df['cumsum_2'] = df[['value_2','group'].groupby('group').cumsum()]
df
4. Sample
Sample方法允許我們從DataFrame中隨機(jī)選擇數(shù)據(jù)。當(dāng)我們想從一個(gè)分布中選擇一個(gè)隨機(jī)樣本時(shí),這個(gè)函數(shù)很有用。
sample1 = df.sample(n=3)
sample1
上述代碼中,我們通過指定采樣數(shù)量 n 來進(jìn)行隨機(jī)選取。此外,也可以通過指定采樣比例 frac 來隨機(jī)選取數(shù)據(jù)。當(dāng) frac=0.5時(shí),將隨機(jī)返回一般的數(shù)據(jù)。
sample2 = df.sample(frac=0.5)
sample2
為了獲得可重復(fù)的樣品,我們可以指定random_state參數(shù)。如果將整數(shù)值傳遞給random_state,則每次運(yùn)行代碼時(shí)都將生成相同的采樣數(shù)據(jù)。
5. Where
where函數(shù)用于指定條件的數(shù)據(jù)替換。如果不指定條件,則默認(rèn)替換值為 NaN。
df['new_col'].where(df['new_col'] > 0, 0)
where函數(shù)首先根據(jù)指定條件定位目標(biāo)數(shù)據(jù),然后替換為指定的新數(shù)據(jù)。上述代碼中,where(df['new_col']>0,0)指定'new_col'列中數(shù)值大于0的所有數(shù)據(jù)為被替換對(duì)象,并且被替換為0。
重要的一點(diǎn)是,pandas 和 numpy的where函數(shù)并不完全相同。我們可以得到相同的結(jié)果,但語法存在差異。Np.where還需要指定列對(duì)象。以下兩行返回相同的結(jié)果:
df['new_col'].where(df['new_col'] > 0, 0)
np.where(df['new_col'] > 0, df['new_col'], 0)
6. Isin
在處理數(shù)據(jù)幀時(shí),我們經(jīng)常使用過濾或選擇方法。Isin是一種先進(jìn)的篩選方法。例如,我們可以根據(jù)選擇列表篩選數(shù)據(jù)。
years = ['2010','2014','2017']
df[df.year.isin(years)]
7. Loc 和 iloc
Loc 和 iloc 函數(shù)用于選擇行或者列。
- loc:通過標(biāo)簽選擇
- iloc:通過位置選擇
loc用于按標(biāo)簽選擇數(shù)據(jù)。列的標(biāo)簽是列名。對(duì)于行標(biāo)簽,如果我們不分配任何特定的索引,pandas默認(rèn)創(chuàng)建整數(shù)索引。因此,行標(biāo)簽是從0開始向上的整數(shù)。與iloc一起使用的行位置也是從0開始的整數(shù)。
下述代碼實(shí)現(xiàn)選擇前三行前兩列的數(shù)據(jù)(iloc方式):
df.iloc[:3,:2]
下述代碼實(shí)現(xiàn)選擇前三行前兩列的數(shù)據(jù)(loc方式):
df.loc[:2,['group','year']]
注:當(dāng)使用loc時(shí),包括索引的上界,而使用iloc則不包括索引的上界。
下述代碼實(shí)現(xiàn)選擇"1","3","5"行、"year","value_1"列的數(shù)據(jù)(loc方式):
df.loc[[1,3,5],['year','value_1']]
8. Pct_change
此函數(shù)用于計(jì)算一系列值的變化百分比。假設(shè)我們有一個(gè)包含[2,3,6]的序列。如果我們對(duì)這個(gè)序列應(yīng)用pct_change,則返回的序列將是[NaN,0.5,1.0]。從第一個(gè)元素到第二個(gè)元素增加了50%,從第二個(gè)元素到第三個(gè)元素增加了100%。Pct_change函數(shù)用于比較元素時(shí)間序列中的變化百分比。
df.value_1.pct_change()
9. Rank
Rank函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行排序。假設(shè)我們有一個(gè)包含[1,7,5,3]的序列。分配給這些值的等級(jí)為[1,4,3,2]。
df['rank_1'] = df['value_1'].rank()
df
10. Melt
Melt用于將維數(shù)較大的 dataframe轉(zhuǎn)換為維數(shù)較少的 dataframe。一些dataframe列中包含連續(xù)的度量或變量。在某些情況下,將這些列表示為行可能更適合我們的任務(wù)。考慮以下情況:
我們有三個(gè)不同的城市,在不同的日子進(jìn)行測(cè)量。我們決定將這些日子表示為列中的行。還將有一列顯示測(cè)量值。我們可以通過使用'melt'函數(shù)輕松實(shí)現(xiàn):
df_wide.melt(id_vars=['city'])
df
變量名和列名通常默認(rèn)給出。我們也可以使用melt函數(shù)的varname和valuename參數(shù)來指定新的列名。
11. Explode
假設(shè)數(shù)據(jù)集在一個(gè)觀測(cè)(行)中包含一個(gè)要素的多個(gè)條目,但您希望在單獨(dú)的行中分析它們。
我們想在不同的行上看到“c”的測(cè)量值,這很容易用explode來完成。
df1.explode('measurement').reset_index(drop=True)
df
12. Nunique
Nunique統(tǒng)計(jì)列或行上的唯一條目數(shù)。它在分類特征中非常有用,特別是在我們事先不知道類別數(shù)量的情況下。讓我們看看我們的初始數(shù)據(jù):
df.year.nunique()
10
df.group.nunique()
3
我們可以直接將nunique函數(shù)應(yīng)用于dataframe,并查看每列中唯一值的數(shù)量:
如果axis參數(shù)設(shè)置為1,nunique將返回每行中唯一值的數(shù)目。
13. Lookup
'lookup'可以用于根據(jù)行、列的標(biāo)簽在dataframe中查找指定值。假設(shè)我們有以下數(shù)據(jù):
我們要?jiǎng)?chuàng)建一個(gè)新列,該列顯示“person”列中每個(gè)人的得分:
df['Person_point'] = df.lookup(df.index, df['Person'])
df
14. Infer_objects
Pandas支持廣泛的數(shù)據(jù)類型,其中之一就是object。object包含文本或混合(數(shù)字和非數(shù)字)值。但是,如果有其他選項(xiàng)可用,則不建議使用對(duì)象數(shù)據(jù)類型。使用更具體的數(shù)據(jù)類型,某些操作執(zhí)行得更快。例如,對(duì)于數(shù)值,我們更喜歡使用整數(shù)或浮點(diǎn)數(shù)據(jù)類型。
infer_objects嘗試為對(duì)象列推斷更好的數(shù)據(jù)類型。考慮以下數(shù)據(jù):
df2.dtypes
A object
B object
C object
D object
dtype: object
通過上述代碼可知,現(xiàn)有所有的數(shù)據(jù)類型默認(rèn)都是object。讓我們看看推斷的數(shù)據(jù)類型是什么:
df2.infer_objects().dtypes
A int64
B float64
C bool
D object
dtype: object
'infer_obejects'可能看起來微不足道,但在有很多列時(shí)作用巨大。
15. Memory_usage
Memory_usage()返回每列使用的內(nèi)存量(以字節(jié)為單位)。考慮下面的數(shù)據(jù),其中每一列有一百萬行。
df_large = pd.DataFrame({'A': np.random.randn(1000000),
'B': np.random.randint(100, size=1000000)})
df_large.shape
(1000000, 2)
每列占用的內(nèi)存:
df_large.memory_usage()
Index 128
A 8000000
B 8000000
dtype: int64
整個(gè) dataframe 占用的內(nèi)存(轉(zhuǎn)換為以MB為單位):
df_large.memory_usage().sum() / (1024**2) #converting to megabytes
15.2589111328125
16. Describe
describe函數(shù)計(jì)算數(shù)字列的基本統(tǒng)計(jì)信息,這些列包括計(jì)數(shù)、平均值、標(biāo)準(zhǔn)偏差、最小值和最大值、中值、第一個(gè)和第三個(gè)四分位數(shù)。因此,它提供了dataframe的統(tǒng)計(jì)摘要。
17. Merge
Merge()根據(jù)共同列中的值組合dataframe。考慮以下兩個(gè)數(shù)據(jù):
我們可以基于列中的共同值合并它們。設(shè)置合并條件的參數(shù)是“on”參數(shù)。
df1和df2是基于column_a列中的共同值進(jìn)行合并的,merge函數(shù)的how參數(shù)允許以不同的方式組合dataframe,如:“inner”、“outer”、“l(fā)eft”、“right”等。
- inner:僅在on參數(shù)指定的列中具有相同值的行(如果未指定其它方式,則默認(rèn)為 inner 方式)
- outer:全部列數(shù)據(jù)
- left:左一dataframe的所有列數(shù)據(jù)
- right:右一dataframe的所有列數(shù)據(jù)
18. Select_dtypes
Select_dtypes函數(shù)根據(jù)對(duì)數(shù)據(jù)類型設(shè)置的條件返回dataframe的子集。它允許使用include和exlude參數(shù)包含或排除某些數(shù)據(jù)類型。
df.select_dtypes(include='int64')
df.select_dtypes(exclude='int64')
19. Replace
顧名思義,它允許替換dataframe中的值。第一個(gè)參數(shù)是要替換的值,第二個(gè)參數(shù)是新值。
df.replace('A', 'A_1')
我們也可以在同一個(gè)字典中多次替換。
df.replace({'A':'A_1', 'B':'B_1'})
20. Applymap
Applymap用于將一個(gè)函數(shù)應(yīng)用于dataframe中的所有元素。請(qǐng)注意,如果操作的矢量化版本可用,那么它應(yīng)該優(yōu)先于applymap。例如,如果我們想將每個(gè)元素乘以一個(gè)數(shù)字,我們不需要也不應(yīng)該使用applymap函數(shù)。在這種情況下,簡(jiǎn)單的矢量化操作(例如df*4)要快得多。
然而,在某些情況下,我們可能無法選擇矢量化操作。例如,我們可以使用pandas dataframes的style屬性更改dataframe的樣式。以下代碼將負(fù)值的顏色設(shè)置為紅色:
def color_negative_values(val):
color = 'red' if val < 0 else 'black'
return 'color: %s' % color
通過Applymap將上述代碼應(yīng)用到dataframe:
df3.style.applymap(color_negative_values)
作者:Soner Y?ld?r?m
deephub翻譯組:Oliver Lee
總結(jié)
以上是生活随笔為你收集整理的frac函数_20个能够有效提高 Pandas数据分析效率的常用函数,附带解释和例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visual tree view在工具箱
- 下一篇: python获取月份字符串_python