Datacamp
python
panda
data science
Data Manipulation with Python
作者:何彥南
Datacamp 課程: Manipulating DataFrames with pandas
注意:
panda 的版本(0.25.0)
,有些功能可能在新版無法使用。
In this chapter, you will learn all about how to index, slice, filter, and transform DataFrames, using a variety of datasets, ranging from 2012 US election data for the state of Pennsylvania to Pittsburgh weather data.
可直接用index 抓取 dataframe 裡面的值,像是下面我們先指定column_lable
['salt']
再指定row_label['jan']
使用column attribute的特性,可以用
df.column_label
呼叫df的指定column,像下面的df.eggs
與df['eggs']
是一樣的意思。
再來我們也可以使用 .loc accessor 的方式抓取dataframe 中你要的部分
loc[row_label ,column_label ]
,其中row_label和column_label 也可以是一個範圍,像是A:B
就是,label A 到label B的範圍。iloc 是用 index (數字)
來指定,而loc 是使用 index_label (名字,大多是字串)
使用雙
[[ ]]
的方式可以在dataframe 中選取多個columns
選取單個column時,可以發現他是一個Series的資料形式
我們可以利用
[ ]
選取部分值
下面是
loc 結合 :
的幾種用法
如果只有
:
的話代表所有 index
也可以對column和row都設定範圍
使用 iloc 也可以達到 一樣的效果,但是要注意的是它是使用index 的編號,而不是名稱。
也可以使用 list 去選取指定的column
同樣的,iloc 也可以用list的形式
要注意的是使用list 後就算只有指定一個column 他還是dataframe 的資料形式。
我們直接對一個 Series 做比較時,它會形成一個等長的bool Series。
我們可以直間將上面的 bool series放入
[ ]
,這樣pandaa 就會去篩選出符合(true) 的value
我們也可以結合
&(and)
或|(or)
,去做多個條件的篩選。
我們可以使用copy直接複製dataframe,像下面有
0
或者空值Nan
要注意。
with all nonzeros
全部值皆為True(不為False或0)的column
,返回boolwith any nonzeros
是否有True(不為0或False)的值
,返回boolwith any NaNs
是否為空值
,返回boolwithout NaNs
是否不為空值
,與isnull() 相反,返回bool。Drop rows with any NaNs
'all'
或'any'
當然我們也可以根據其他column 去篩選另外一個column ,
[ ] 這種篩選法可以接受所有一樣長度的bool Series
。
我們也以利用這個特性去改變value,像下面只要salt這行>55 就對eggs這行中同個row的值+5
我們可以利用floordiv 對所有的值除於12後只留整數。
NumPy 的floor_divide() 也可以達到一樣的效果
使用apply 可以使用function 或 lambda 去處理dataframe所有值
function
lambda
可以直接用
df['column_name']=
的方式存取轉換過的 column
返回 index(列標籤)
使用upper()可以把英文字改成大寫,lower 則改小寫
也可以結合map()
也可以直接指定多個column,做基本的運算併產生一個新的column。
Having learned the fundamentals of working with DataFrames, you will now move on to more advanced indexing techniques. You will learn about MultiIndexes, or hierarchical indexes, and learn how to interact with and extract data from them.
Series式組成dataframe的基本,從下面可以看到它
包含一連串的值和資料類型
。
我們也可以直接指定一組Series 當作index
由下圖可知,,index可以隨意選取,index.name 還可以知道 index的名稱。
index 也可以改名字
記住,index 裡面的單個值是無法更改的
這邊我們使用 unemployment的資料示範基本的index操做
info() 也可以看到當前的index 是由一串連續數字組成,稱作
rangeindex
首先我們選擇Zip為我們新的index
再來我們移除原本的column
利用 type()、name、columns,來檢視index
在 read_csv() 的時候我們也可以使用 index_col 直接設定當index的column
接著我們要介紹分層的index
首先我們使用set_index(),把兩個column 設成index
我們得到了一個 MultiIndex 的東西,name 也沒有了,取代的是names
接著我們使用sort_index() 將資料根據其中一個index做分類排序
我們可以將兩個
分別來自 Symbol 和 Data 的index放入tuple中
,並使用loc[ ] 呼叫對應的row,再加上column_label 就可以獲取指定的值。
利用整理過的 MultiIndex 和loc[ ] 的特性,我們可以輕鬆依據類別選取需要的部分資料
更厲害的是,我們可以加入tuple對不同的index 做選取,還有不要忘了之前教的
:
他就是所有的意思
加入slice() 官方文檔
Here, you will learn how to reshape your DataFrames using techniques such as pivoting, melting, stacking, and unstacking. These are powerful techniques that allow you to tidy and rearrange your data into the format that allows you to most easily analyze it for insights.
pivot() 他可以指定轉換後的 column 和 index 還有values,雖然它強大但它還是有它的限制,但要記的
一組column和index只能對應一個value
。
因為沒有指定values所以會返回除了設為index和column以外,所有的columns作為values的結果,這種利用column的特性生成全新的dataframe,所以我們可以稱pivot()為column的魔術師。
再來我們要介紹堆疊與非堆疊的dataframe
使用 unstack()
透過指定level(分類)
而stack()就是反過來將column 轉成index
swaplevel可以交換index的前後順序
Sorting rows
melt()與pivot()是相對的,所以這邊我們先製造一個pivot後的dataframe
這邊可以發現我們直接melt,
它會把column轉成row塞到新產生的variable行
,但因為沒設參數,所以結果不太優
設定id_vars,我們將
treatment
放到一個獨立的column,成為id且會對應一個variable
設定 value_vars,選取要從pivot還原的變數(column),variable為原本的行名,value為原本column底下對應的值
設定 value_name,改轉換後value的名字
有些情況pivot無法轉換,像下面有重複值的時候。
這時我們就要使用pivot_table,可以看到它預設是
取多個重複值的mean
aggfunc='count'
可以返回個配對的數量。
In this chapter, you'll learn how to identify and split DataFrames by groups or categories for further aggregation or analysis. You'll also learn how to transform and filter your data, including how to detect outliers and impute missing values. Knowing how to effectively group data in pandas can be a seriously powerful addition to your data science toolbox.
這邊count 是表示符合
sales['weekday']=='Sun'
這個條件的數量
groupby 會根據指定的欄位把其中的值分group,然後我們可以在後面對這些group做一些事,像是count()可以知道各個group有幾個資料
這邊是對weekday group 完後在挑出
bread
和butter
兩個column顯示
這邊一次對兩個column group ,它會先依據
city
group在依weekday
group
當然groupby也可以用在series上,
把series當作一個column放進去
就好了,會依據裡面的值去分類。
在這邊
customers
這個series就是一個分類的標準,真正分類的還是前面導向的sales資料
unique跟groupby很像,但只會返回不一樣值的array,速度快
用agg()的方式可以在一個固定的軸上做多個操作,下面就是同時使用
max
和sum
使用,而軸就是bread
和butter
這兩個columns
Aggregation functions
在agg()裡面我們也可以放入function
使用dictionaries,可以針對不同的column使用不同的function,很方便呢!
使用自己定義的
z-score
加入groupby 依據
'yr'
對year 做分群,在對'mpg'
裡的每一群做Z-score
使用apply() 加上function,在function裡把groupby後的結果整理出來,放到dict裡並轉成dataframe。
在function裡面group是一個
groupby object
握們可以透過[column_name]直接選去分類後的某一個column
首先,對 year group後取每組的mean
製造
groupby object
,我們可以看到它是一個groupby的資料型態,groups會返回dict,keys則會返回 dixt的key也就是所有類別。
我們可以對
groupby object
做迭代,group_name
代表dict的key、group 代表該group的dataframe
在 for 迴圈裡加入contain
comprehension 的形式
加入 Boolean,這樣就可以知道每年中符合與不符合條件的有多少