前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas-常用基本功能

Pandas-常用基本功能

作者头像
DataScience
发布2019-12-30 11:40:53
5520
发布2019-12-30 11:40:53
举报
文章被收录于专栏:A2DataA2Data

一枕新凉一扇风

代码语言:javascript
复制

##本文教程 部分参考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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档