Pandas-經常使用基本功能

一枕新涼一扇風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




本文分享自微信公衆號 - DataScience(DataScienceTeam)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。python

相關文章
相關標籤/搜索