Pandas

  1. Pandas
    1. Pandas简介
    2. Pandas数据结构
    3. 数据操作常用API
    4. DataFrame运算
    5. DataFrame画图
    6. 文件读取与存储

Pandas

Pandas简介

  • 专门用于数据挖掘的开源python库
  • 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
  • 基于matplotlib,能够简便的画图
  • 独特的数据结构
  • 相比于Numpy优势:
    • pandas的数据展示结果可读性更好
    • 处理数据更加方便
    • 读取文件更加方便

Pandas数据结构

  • Series结构(一维数组的数据结构):

    • Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,如整数、字符床、浮点数等,主要由一组数据和与之相关的索引两部分构成
    • Series创建
    1
    2
    3
    4
    5
    6
    import pandas as pd
    pd.Series(data=data, index=index, dtype=dtype)
    # 参数:data:可以是array,list;index:索引,和data长度一致,不传默认生成0-n的整数索引;dtype:数据的类型
    pd1 = pd.Series(np.arange(10))
    # 也可通过字典创建
    pd1 = pd.Series({"a":"b"})
    • Series属性
    1
    2
    3
    4
    5
    6
    # 获取索引
    pd1.index
    # 获取值
    pd1.values
    # 也可通过下标获取值
    pd1[0]
  • Dataframe结构(二维数组的数据结构):

    • DataFrame是一个类似于二维数组或表格的对象,既有行索引又有列索引
    • DataFrame创建
    1
    2
    3
    4
    5
    pd.DataFrame(data=data, index=index, columns=columns)
    # 参数:data:可以是array,list;index:行索引,和data长度一致,不传默认生成0-n的整数索引;columns:列索引,和data长度一致,不传默认生成0-n的整数索引;
    index = ["行1","行2"]
    columns = ["列1","列2","列3"]
    df1 = pd.DataFrame(np.random.randn(2,3),index=index,columns=columns)
    • DataFrame属性
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    df1.shape # 获取DataFrame形状
    df1.index # 获取DataFrame行索引
    df1.columns # 获取DataFrame列索引
    df1.values # 获取DataFrame值,返回array数组
    df1.T # 对DataFrame进行行列装换
    df1.head(num) # 显示前num行
    df1.tail(num) # 显示后num行
    df1.index = ["行_1","行_2"] # 修改索引,必须整体修改
    df1.reset_index(drop=False) # 重置索引,False为不删除索引,True为删除索引
    df1.set_index(["列1"]) # 设置列1为索引列
  • Multilndex结构(三维数组的数据结构):

    • Multilndex是三维数据结构:也称多级索引,可以在Series、DataFrame对象上拥有2个以及2个以上的索引
    • Multilndex创建
    1
    2
    3
    4
    5
    6
    df2 = df1.set_index(["列1", "列2"])
    # 获取索引
    df2.index
    MultiIndex(levels=[[列1去重后的所有元素],[列2去重后的所有元素]],
    labels=[[列1该位置元素对应levels的下标],[列1该位置元素对应levels的下标]],
    name=["列1","列2"])

    数据操作常用API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 索引切片
df1 = pd.read_csv("csv.csv") # 读取csv文件
df2 = df1.drop(["列1","列2"],axis=1) # 删除列1列2,设置为0则是行
df2["列"]["行"] # 索引数据,只能先列后行,且不支持切片
df2.loc["行1":"行5","列"] # 索引数据,只能先行后列
df2.iloc[:num,:num] # 通过下标索引,先行后列
df2.ix[0:4,["列1","列2","列3"]] # 可以通过名字或者下标来获取,推荐使用loc或iloc获取值
# 赋值
df2["列1"]=1 # 把列1值变成1,或者新增
df2.列1 = 0 # 把列1值变成1,或者新增
# 数据类型转换
df2['时间列1'] = pd.to_datetime(df2['时间列1'])

# 排序
df2.sort_index() # 按索引升序排序
df2.sort_values(by=["列1","列2"], ascending=True) # 先按列1排序,在列1相同的前提下按列2排序,升序
# 缺失值处理
df2.drop_duplicates(["列1","列2"]) # 按列1、列2去重
pd.isnull(df2) # 有缺失值返回True,没有返回False
pd.notnull(df2) # 有缺失值返回False,没有返回True
df3 = df2.dropna(axid="rows") # 返回按行删除缺失值的dataframe
df2.fillna(value, inplace=True) # 在df2中的NaN替换成value
df3 = df2.replace(to_replace="a", value="b") # 返回一个把a替换成b的dataframe
# 数据离散化
df4 = pd.qcut(df2["列1"], 10) # 返回把列1分别对应的区间
df4.value_counts() # 返回对应区间的数据个数
pd.cut(df2["列1"],[-1,0,1]) # 把列1自定义分为4个区间
df5 = pd.get_dummies(df2["列1"], prefix="列1") # 把列1进行one_hot编码,生成的列名前加上列1_
# 数据合并
pd.concat([df1,df2],axis=1) # 把df1和df2行合并,当axis=0时按列拼接
pd.merge(df1,df2,how="inner",on=None) # 以how方式on为连接的键连接df1,df2
# how:inner(默认):内连接(取交集);outer:外连接(并集);left:左连接;right:右连接
# on:list,如果为None表示自动寻找df1和df2中列名一致的进行匹配

# 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
pd.crosstab(df1,df2)
# 透视表:透视表是将原有的dataframe的列分别作为行索引和列索引,然后对指定的列应用聚集函数
df5.pivot_table(['a'],index='c')
# 分组聚合
df5.groupby(['a']) # 把df5按a列进行分组
count = df5.groupby(['a']).count() # 把df5按a列进行分组,计算没一列有多少个数据

DataFrame运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 加减
df2["列1"].add(1) # 把列1所有值加1
df2["列1"].sub(1) # 把列1所有值减1
# 按条件取值
df2[df2["列1"]>10] # 取出df2列1中大于10的数据
df2[(df2["列1"]>10) & (df2["列1"]<20)] # 取出df2列1中大于10且小于20的数据
df2.query("列1<20 & 列1>10") # 取出df2列1中大于10且小于20的数据
df2[df2["列1"].isin([10,20])] # 取出df2列1中值是10和20的
# 统计
df2.describe() # 返回对应列的和、平均值、标准差、最小值、四分位的值、最大值
df2.sum() # 每列的和
df2.max() # 每列的最大值
df2.min() # 每列的最小值
df2.mean() # 每列的平均值
df2.median() # 每列的中位数
df2.mode() # 每列中的出现次数最多的数
df2.abs() # 所有数的绝对值
df2.prod() # 每列的乘积
df2.std() # 每列的标准差
df2.var() # 每列的方差
df2.idxmax() # 每列中最大值的索引
df2.idxmin() # 每列中最小值的索引
df2.cumsum() # 每列累计前面数据的和
df2.cummax() # 每列累计前面数据的最大值
df2.cummin() # 每列累计前面数据的最小值
df2.cumprod() # 每列累计前面数据的乘积
# 自定义运算
df2.apply(lambda x: x.max()-x.min(), axis=0) # 返回每列的最大值与最小值之差,当axis为1时按行传入

DataFrame画图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
# 折线图
df2["列1"].plot()
plt.show()
# 垂直条形图
df2["列1"].plot(kind="bar")
plt.show()
# 水平条形图
df2["列1"].plot(kind="barh")
plt.show()
# 直方图
df2["列1"].plot(kind="hist")
plt.show()
# 饼图
df2["列1"].plot(kind="pei")
plt.show()
# 散点图
df2["列1"].plot(kind="scatter")
plt.show()

文件读取与存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# csv读取与存储
pd.read_csv(路径)
pd.to_csv(路径)
# json读取与存储
pd.read_json(路径)
pd.to_json(路径)
# html读取与存储
pd.read_html(路径)
pd.to_html(路径)
# clipboard读取与存储
pd.read_clipboard(路径)
pd.to_clipboard(路径)
# exel读取与存储
pd.read_exel(路径)
pd.to_exel(路径)
# hdf5读取与存储
pd.read_hdf(路径,key)
pd.to_hdf(路径,key)
# feather读取与存储
pd.read_feather(路径)
pd.to_feather(路径)
# parquet读取与存储
pd.read_parquet(路径)
pd.to_parquet(路径)
# msgpack读取与存储
pd.read_msgpack(路径)
pd.to_msgpack(路径)
# stata读取与存储
pd.read_stata(路径)
pd.to_stata(路径)
# sas读取
pd.read_sas(路径)
# pickle读取与存储
pd.read_pickle(路径)
pd.to_pickle(路径)
# sql读取与存储
pd.read_sql(路径)
pd.to_sql(路径)
# gbq读取与存储
pd.read_gbq(路径)
pd.to_gbq(路径)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zoubinbf@163.com

×

喜欢就点赞,疼爱就打赏