Pandas進階小技巧
Pandas進階小技巧(清晰版原文點這裡)
Pandas是一個在Python中廣泛應用的資料分析包。 網上有很多關於Pandas的經典教程,但本文介紹幾個隱藏的炫酷小技巧,相信這些會對
新手
有所幫助。 或許本文中的某些命令你早已知曉,只是沒意識到它還有這種開啟方式。
預計學習用時:30分鐘。
本教程基於Python 3。6版本、Pandas 0。23。4版本。
1。 read_csv
這是讀取資料的入門級命令。當要你所讀取的資料量特別大時,試著加上這個引數
nrows=100
,就可以在載入全部資料前先讀取一小部分資料。
此外,還可以加上
usecols =
[‘c1’,
‘c2’,
…
]
來載入所需要的指定列。另外,如果你知道某些列的型別,你可以加上
dtype =
{‘c1’: str,
‘c2’:
int,
…}
,這樣會加快載入的速度。加入這些引數的另一大好處是,如果這一列中同時含有字串和數值型別,而你提前宣告把這一列看作是字串,那麼這一列作為主鍵來融合多個表時,就不會報錯了。
比如
df = pd。read_csv(‘data。csv’, nrows=100, usecols=[‘c1’,
‘c2’], dtype =
{‘c1’: str,
‘c2’:
int})
2。 select_dtypes
如果已經在Python中完成了資料的預處理,這個命令可以幫你節省一定的時間。在讀取了表格之後,每一列的預設資料型別將會是
bool
,
int64
,
float64
,
object
,
category
,
timedelta64
,或者
datetime64
。首先你可以觀察一下大致情況,使用:
df。dtypes。value_counts()
來了解你的dataframe的每項資料型別,然後再使用:
df。select_dtypes(include=[‘float64’,
‘int64’])
獲取一個僅由數值型別組成的sub-dataframe。
3。 copy
如果你沒聽說過它的話,我不得強調它的重要性。輸入下面的命令:
import pandas as pd
df1 = pd。DataFrame({‘a’: [0,0,0], ‘b’: [1,1,1]})
df2 = df1
df2[‘a’] = df2[‘a’] + 1
df1。head()
a
b
0
1
1
1
1
1
2
1
1
你會發現
df1
已經發生了改變。這是因為
df2 = df1
並不是生成一個
df1
的複製品並把它賦值給
df2
,而是設定一個指向
df1
的指標。所以只要是針對df2的改變,也會相應地作用在
df1
上。為了解決這個問題,你既可以這樣做:
df2 = df1。copy()
4。 map
這個炫酷的命令讓你的資料轉換變得輕鬆。首先定義一個
dictionary
,“key”是轉換前的舊值,而“values”是轉換後的新值。
level_map =
{‘high’:
1,
‘medium’:
2,
‘low’:
3}
df[‘c_level’]
= df[‘c’]。map(level_map)
適用情景:把
high
、
medium
,
low
等字串轉換成3、2、1等數值(為了建模)。
5。 用不用apply?
如果我們想在現有幾列的基礎上生成一個新列,並一同作為輸入,那麼有時
apply
函式會相當有幫助。
def rule(x, y):
if x == ‘high’ and y > 10:
return 1
return 0
df = pd。DataFrame({ ‘c1’:[ ‘high’ ,‘high’, ‘low’, ‘low’], ‘c2’: [0, 23, 17, 4]})
df[‘new’] = df。apply(lambda x: rule(x[‘c1’], x[‘c2’]), axis = 1)
df。head()
c1
c2
new
0
high
0
0
1
high
23
1
2
low
17
0
3
low
4
0
在上面的程式碼中,我們定義了一個有兩個輸入變數的函式,並依靠
apply
函式使其作用到列
“c1”
和
“c2”
上。
但是
apply
函式在有些情況下實在是太慢了。如果你是想計算
“c1”
和
“c2”
列的最大值,你當然可以這樣去做:
df[‘maximum’]
= df。apply(lambda x: max(x[‘c1’], x[‘c2’]), axis =
1)
但你會發現相比於以下命令,
apply
實在是慢太多了:
df[‘maximum’]
= df[[‘c1’,‘c2’]]。max(axis =1)
結論:如果你可以採用其他內建函式(他們一般速度更快),請不要使用
apply
。比如說,如果你想把
“c”
列的值近似取整,那麼請用
round(df[‘c’],
0)
或
df[‘c’]。round(0)
而不是上文的
apply
函式。
6。 value counts
這個命令用於檢查值的分佈。你想要檢查下“c”列中出現的值以及每個值所出現的頻率,可以使用:
df[‘c’]。value_counts()
下面是一些有用的小技巧/引數:
normalize =
True
:檢視每個值出現的頻率而不是頻次數。
dropna =
False
: 把缺失值也保留在這次統計中。
sort =
False
: 將資料按照值來排序而不是按照出現次數排序。
df[‘c]。value_counts()。reset_index()
: 將這個統計表轉換成pandas的dataframe並且進行處理。
7。 缺失值的數量
當構建模型時,我們可能會去除包含過多缺失值或是全部是缺失值的行。這時可以使用
。isnull()
和
。sum()
來計算指定列缺失值的數量。
import pandas as pd
import numpy as np
df = pd。DataFrame({ ‘id’: [1,2,3], ‘c1’:[0,0,np。nan], ‘c2’: [np。nan,1,1]})
df = df[[‘id’, ‘c1’, ‘c2’]]
df[‘num_nulls’] = df[[‘c1’, ‘c2’]]。isnull()。sum(axis=1)
df。head()
id
c1
c2
num_nulls
0
1
0。0
NaN
1
1
2
0。0
1。0
0
2
3
NaN
1。0
1
8。 依據指定ID來選取行
在SQL中我們可以使用
SELECT * FROM … WHERE ID in
(‘A001’,‘C022’,
…)
來獲取含有指定ID的記錄。如果你也想在Pandas中做類似的事情,你可以使用:
df_filter = df[‘ID’]。isin([‘A001’,‘C022’,。。。])
df[df_filter]
9。 基於分位數分組
面對一列數值,你想將這一列的值進行分組,比如說最前面的5%放入組別一,5-20%放入組別二,20%-50%放入組別三,最後的50%放入組別四。當然,你可以使用
pandas。cut
,但你也可以使用下面這種選擇:
import numpy as np
import pandas as pd
df= pd。DataFrame({‘c’: np。random。normal(0, 1, 100)})
cut_points = [np。percentile(df[‘c’], i) for i in [50, 80, 95]]
df[‘group’] = 1
for i in range(3):
df[‘group’] = df[‘group’] + (df[‘c’] < cut_points[i])
df。head()
c
group
0
-0。084178
4
1
0。507027
3
2
0。712228
3
3
-0。858951
4
4
0。717616
3
這種方法的執行速度很快(因為沒有使用到apply函式)。
10。 to_csv
這又是一個大家都會用的命令。我想在這裡列出兩個小技巧。首先是
print(df[:5]。to_csv())
你可以使用這個命令打印出將要輸出檔案中的前五行記錄。
另一個技巧是用來處理整數值和缺失值混淆在一起的情況。如果一列含有缺失值和整數值,那麼這一列的資料型別會變成
float
而不是
int
。當匯出表格時,你可以加上
float_format=‘%。0f’
以便將所有的浮點數近似成整數。當你想把所有列的輸出值都變成整數格式時,就可以使用這個技巧,這樣一來你就會告別所有數值後帶“。0”的煩惱。
11。 其他常見問題
其他關於Pandas的常見問題,可參考SofaSofa的站內搜尋Pandas。
也歡迎各位朋友積極在SofaSofa上提問和解答。
SofaSofa.io:【資料科學/機器學習】面試常見問題
SofaSofa資料實戰:還在拿MNIST練習?不如試試這個
資料科學麵試中的
Case Study
有哪些常見套路?
看這裡
你想知道自己水平如何?
不如來做套資料科學、機器學習的自測題(戳這裡,以及戳這裡)
更多中美企業校招、社招機器學習、資料科學崗位面試題(看這裡)
SofaSofa資料科學社群
上一篇:圖片的相對路徑怎麼寫?
下一篇:找工作,千萬別看職業藝術照