一枕新涼一扇風html
##本文教程 部分參考AI|派 pandas 教學。
# 感謝你們分享關注,幫助更多的人。
經常使用基本功能
當咱們構建好了Series和 DataFrame 以後,會常常用到哪些功能呢?
#導入相關庫
import numpy as np
import pandas as pd
index = pd.Index(data=["A","B","C","D","風"],name="name")
data={
"age":["18","19","20","21","25"],
"sex":["女","男","男","女","男"],
"city":["Bei","shang","guang","shen","xu"]
}
user_info = pd.DataFrame(data=data, index=index)
user_info
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
#通常拿到數據,咱們第一步須要作的就是了解下數據的總體狀況,可使用 info方法來查看。
user_info.info()
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to 風
Data columns (total 3 columns):
age 5 non-null object
sex 5 non-null object
city 5 non-null object
dtypes: object(3)
memory usage: 160.0+ bytes
#若是數據量很是大,我想看看部分數據, 好比頭N 條 或者 末尾N 條
# 頭N head
# 末N tail
user_info.head()
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
user_info.head(2)
age sex city
name
A 18 女 Bei
B 19 男 shang
user_info.tail(2)
age sex city
name
D 21 女 shen
風 25 男 xu
#Pandas 中的數據結構有 ndarray 中的經常使用方法 以及屬性,
#例如, 經過 .shape 獲取數據的形狀
user_info.shape
(5, 3)
# 經過.T 獲取數據的轉置
user_info.T
name A B C D 風
age 18 19 20 21 25
sex 女 男 男 女 男
city Bei shang guang shen xu
#那麼咱們若是想要經過DataFrame來獲取它含有的原始數據, 能夠經過 .value 來獲取
#獲取後的數據類型其實就是一個 ndarray。
user_info.values
array([['18', '女', 'Bei'],
['19', '男', 'shang'],
['20', '男', 'guang'],
['21', '女', 'shen'],
['25', '男', 'xu']], dtype=object)
描述與統計
最大值
最小值
平均數
中位數
#查看年齡的最大值
user_info.age.max()
'25'
#查看年齡最小值
user_info.age.min()
'18'
#累積求年齡總和
user_info.age.sum()
'1819202125'
user_info.age.cumsum()
name
A 18
B 1819
C 181920
D 18192021
風 1819202125
Name: age, dtype: object
user_info
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
user_info.age.sum()
'1819202125'
user_info.age.astype(int)
name
A 18
B 19
C 20
D 21
風 25
Name: age, dtype: int32
user_info.age.astype(int).sum()
103
user_info.age.astype(int).cumsum()
name
A 18
B 37
C 57
D 78
風 103
Name: age, dtype: int32
user_info.sex.cumsum()
name
A 女
B 女男
C 女男男
D 女男男女
風 女男男女男
Name: sex, dtype: object
若是想要獲取更多的統計方法。
請參考官方連接:http://pandas.pydata.org/pandas-docs/stable/basics.html#descriptive-statistics
#若是想要一次性獲取多個統計指標,只需調用 describe 方法便可。
user_info.describe()
age sex city
count 5 5 5
unique 5 2 5
top 18 男 Bei
freq 1 3 1
user_info.describe(include=["object"])
age sex city
count 5 5 5
unique 5 2 5
top 18 男 Bei
freq 1 3 1
#統計性別 出現頻次
user_info.sex.value_counts()
男 3
女 2
Name: sex, dtype: int64
# 要是想獲取某列中 最大值 或者最小值
# 最大值 idxmax
user_info.age.astype(int).idxmax()
'風'
#最小值 idxmin
user_info.age.astype(int).idxmin()
'A'
離散化
咱們也會碰到這樣的需求,想要將年齡進行離散化 (分桶) ,
更簡潔的來講,就是將年齡分紅幾個區間。
例如 將年齡分紅三個段。
pandas 的cut 方法
pd.cut(user_info.age.astype(int),3)
name
A (17.993, 20.333]
B (17.993, 20.333]
C (17.993, 20.333]
D (20.333, 22.667]
風 (22.667, 25.0]
Name: age, dtype: category
Categories (3, interval[float64]): [(17.993, 20.333] < (20.333, 22.667] < (22.667, 25.0]]
# 發現以上是有cut 自動生成等距的離散區間,那麼本身定義也是沒問題的。
user_info.age
name
A 18
B 19
C 20
D 21
風 25
Name: age, dtype: object
pd.cut(user_info.age.astype(int),[18,19,21,25])
name
A NaN
B (18, 19]
C (19, 21]
D (19, 21]
風 (21, 25]
Name: age, dtype: category
Categories (3, interval[int64]): [(18, 19] < (19, 21] < (21, 25]]
# 那麼你離散化 以後,想給區間起個名字
# 能夠指定labels 參數
pd.cut(user_info.age.astype(int),[18,19,21,25],labels=["年","輕","真好"])
name
A NaN
B 年
C 輕
D 輕
風 真好
Name: age, dtype: category
Categories (3, object): [年 < 輕 < 真好]
# 除了可使用 cut 進行離散化以外,qcut 也能夠實現離散化。
區別就是: cut 是根據每一個值的大小來進行離散化的
而: qcut 是根據每一個值出現的次數來進行離散化的。
File "<ipython-input-56-e7dd7019b560>", line 2
區別就是: cut 是根據每一個值的大小來進行離散化的
^
SyntaxError: invalid character in identifier
pd.qcut(user_info.age.astype(int),3)
name
A (17.999, 19.333]
B (17.999, 19.333]
C (19.333, 20.667]
D (20.667, 25.0]
風 (20.667, 25.0]
Name: age, dtype: category
Categories (3, interval[float64]): [(17.999, 19.333] < (19.333, 20.667] < (20.667, 25.0]]
排序功能
在進行數據分析時,會常常用到數據排序。
Pandas 支持兩種排序方式
1)按軸(索引或列) 排序
2)按照實際值排序
#索引排序:sort_index (正序)
user_info.sort_index()
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
#倒序排 設置參數 axis=1 和 ascending=False
user_info.age.astype(int).sort_index()
name
A 18
B 19
C 20
D 21
風 25
Name: age, dtype: int32
user_info.sort_index(axis=1, ascending=False)
sex city age
name
A 女 Bei 18
B 男 shang 19
C 男 guang 20
D 女 shen 21
風 男 xu 25
age
#設置按照年齡排序 sort_values 方法,設置參數 by="age"
user_info.sort_values(by="age")
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
user_info.sort_values(by="age")
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
user_info.sort_values(by="name")
age sex city
name
A 18 女 Bei
B 19 男 shang
C 20 男 guang
D 21 女 shen
風 25 男 xu
# 有時候 咱們須要按照多個值來排序,例如 年齡 和城市 一塊兒排序
# 那麼 能夠設置參數 by 爲一個list
## 注意 list 中 每一個元素的順序會影響排序優先級的。
index = pd.Index(data=["年","少","風"], name="name")
data={
"age":[18,21,25],
"city":["北","上","廣"]
}
user_line = pd.DataFrame(data=data,index=index)
user_line
age city
name
年 18 北
少 21 上
風 25 廣
user_line.sort_index()
age city
name
少 21 上
年 18 北
風 25 廣
user_line.sort_index(axis=1,ascending=False)
city age
name
年 北 18
少 上 21
風 廣 25
age
user_line.sort_values(by="age")
age city
name
年 18 北
少 21 上
風 25 廣
city
#按list 排序
user_line.sort_values(by=["age","city"])
age city
name
年 18 北
少 21 上
風 25 廣
不少。
#在排序以後 獲取 最大的n個值 或者 最小的n個值
# 最大 nlargest
# 最小 nsmalest
#優點 比以前head (n) 要快的不少。
2
user_line.age.nlargest(2)
name
風 25
少 21
Name: age, dtype: int64
2
user_line.age.nsmallest(2)
name
年 18
少 21
Name: age, dtype: int64
## 函數應用
## Pandas 雖然爲咱們提供了豐富的函數,有時候咱們須要本身定製一些函數,而且將它應用到 DataFrame 或 Series
### 經常使用的函數
Map
apply
applymap
EG: 例如我想經過年齡判斷用戶是否爲成年人,大於18 ,經過map 能夠輕鬆搞定。
# 接受一個 lamba 函數
user_line.age.map(lambda x:"yes" if x >18 else "no")
name
年 no
少 yes
風 yes
Name: age, dtype: object
# 又 好比,我想經過城市 來判斷 南方 仍是北方 。
city_map = {
"北":"north",
"上":"south",
"廣":"south"
}
# 傳入一個map
user_line.city.map(city_map)
name
年 north
少 south
風 south
Name: city, dtype: object
# apply 方法既支持series , 也支持DataFrame ,在對Series操做時會做用到每一個值上,在對
# DataFrame操做時會做用到 全部行或 全部列。 (可經過axis參數來控制)
no
# 對於Series 來講,apply 方法與map 方法區別不大
user_line.age.apply(lambda x : "yes" if x> 18 else "no")
name
年 no
少 yes
風 yes
Name: age, dtype: object
0
#對於 DataFrame 來講,apply 的方法做用對象 是一行或者一列數據(一個Series)
user_line.apply(lambda x: x.max(),axis=0)
age 25
city 廣
dtype: object
# applymap 方法針對於DataFrame,它做用於DataFrame中的每一個元素
# 效果相似於apply 對 Series 的效果
user_line.applymap(lambda x: str(x).lower())
age city
name
年 18 北
少 21 上
風 25 廣
使用 rename 輕鬆實現
# 修改列/索引名稱
修改列名,只須要設置參數 columns
使用 rename 輕鬆實現
City
user_line.rename(columns={"age":"Age","city":"City"})
Age City
name
年 18 北
少 21 上
風 25 廣
# 那麼相似的,修改索引名只須要設置參數 index 便可
user_line.rename(index={"年":"N","少":"B"})
age city
name
N 18 北
B 21 上
風 25 廣
# 類型操做
# 若是想要獲取某種類型的列數的話,可使用 get_dtype_counts 方法。
user_line.get_dtype_counts()
int64 1
object 1
dtype: int64
# 若是想要轉化數據類型的話 ,能夠經過 astype 來完成。 以前已經有演示
# 由於age 爲字符串,沒法進行求和 和累加。因此須要先轉化數據類型
user_info.age.astype(int)
name
A 18
B 19
C 20
D 21
風 25
Name: age, dtype: int32
- 常見的OBJECT 類型轉化爲其餘類型
數字
日期
時間差
Pandas
`to_numeric
`to_datetime
`to_timedelta
user_line["height"]=["176","178","180"]
user_line
age city height
name
年 18 北 176
少 21 上 178
風 25 廣 180
#
# 將身高這列轉化爲數字
# 強制轉化,能夠傳入參數 errors
# 至關因而強轉失敗時的處理方式。
#·默認狀況下
# ·errors='raise' , 這意味着強轉失敗後 直接跑出異常。
# ·設置errors='coerce'能夠在強轉失敗時,將全部問題的元素賦值爲pd.NaT
# (對於datetime和timedelta) 或 np.nan(數字)。
# ·設置errors='ignore'能夠在強轉失敗時返回原有的數據。
pd.to_numeric(user_line.height, errors="coerce")
name
年 176
少 178
風 180
Name: height, dtype: int64
raise
pd.to_numeric(user_line.height,errors="raise")
name
年 176
少 178
風 180
Name: height, dtype: int64
ignore
pd.to_numeric(user_line.height,errors="ignore")
name
年 176
少 178
風 180
Name: height, dtype: int64
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - DataScience(DataScienceTeam)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。python