一枕新凉一扇风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