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

相关文章
相关标签/搜索