欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据分析之Pandas库

程序员文章站 2022-06-08 13:10:02
文章目录1 Pandas介绍2 使用Pandas的优势3 Pandas数据结构4 基本数据操作5 DataFrame运算6 Pandas绘图7 文件读取与存储1 Pandas介绍Pandas由WesMcKinney开发,是一种专门用于数据挖掘的库。其以Numpy库为基础,借力Numpy模块在计算方面性能高的优势来增强性能。也基于matplotlib库,能够简便绘图,并且有着独特的数据结构。2 使用Pandas的优势Numpy已近可以帮助我们解决问题,能够结合Matplotlib解决部分数据的展示....

1 Pandas介绍

Pandas由WesMcKinney开发,是一种专门用于数据挖掘的库。其以Numpy库为基础,借力Numpy模块在计算方面性能高的优势来增强性能。也基于matplotlib库,能够简便绘图,并且有着独特的数据结构。

2 使用Pandas的优势

Numpy已近可以帮助我们解决问题,能够结合Matplotlib解决部分数据的展示等问题,那为什么要使用Pandas,使用它的优势主要有以下几个部分:

  • 增强图表的可读性
  • 便捷的数据处理能力
  • 读取文件特别方便
  • 封装了Matplotlib的画图和Numpy的计算
3 Pandas数据结构

Pandas一共有三种数据结构,分别是Series、DataFrame和MultiIndex。三者分别是一维数据结构、二维数据结构和三维数据结构

➢ Series结构

Series是一个类似于一维数组结构,它能够保存任何数据类型的数据,如整数、字符串、浮点数等,主要由一组数据和与之相关联的数组两部分组成

Series的创建(通过已有数据创建):

import pandas as pd
# data:传入的数据,可以是ndarray、list等
# index:索引,必须是唯一且与数据的长度相等,如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
# dtype:数据类型
pd.Series(data=None, index=None, dtype=None)
  • 指定内容默认索引创建
import pandas as pd
import numpy as np
pd.Series(data=np.arange(10))

数据分析之Pandas库

  • 指定索引创建
import pandas as pd
pd.Series(data=[6, 7, 8, 9, 10], index=[0, 1, 2, 3, 4])

数据分析之Pandas库

  • 通过字典数据创建
import pandas as pd
pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中国上海'})

数据分析之Pandas库
为更方便地操作Series对象中的索引和数据,Series中提供两个属性,分别是index和values。Series的属性:

  • index
import pandas as pd
staff = pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中国上海'})
print('职员的姓名:',staff[0])
print('职员的年龄:',staff['age'])
print(staff.index)

数据分析之Pandas库

  • values
import pandas as pd
staff = pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中国上海'})
print(staff.values) # <class 'numpy.ndarray'>

数据分析之Pandas库
➢ DataFrame结构:

DataFrame是一个类似于二维数组或表格的对象,既有行索引和列索引。DataFrame的创建:

import pandas as pd
# index:行标签,如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
# columns:列标签,如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
pd.DataFrame(data=None, index=None, columns=None)

例一:

import pandas as pd
import numpy as np
pd.DataFrame(data=np.random.randn(2, 3))

数据分析之Pandas库
例二:

# 分别使用numpy和pandas生成学生的成绩表,生成10个同学的6个科目的成绩
import numpy as np
score = np.random.randint(0, 100, (10, 6))
print(score)
score_df = pd.DataFrame(score)
score_df

数据分析之Pandas库
增加行列索引:

import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
print(score)
score_df = pd.DataFrame(score)
print(score_df)
# 构建行索引序列
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
# 构建列索引序列
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
# 添加行索引
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data

数据分析之Pandas库
DataFrame的属性:

  • shape:查看几行几列
'''
查看几行几列
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.shape)
data

数据分析之Pandas库

  • index:获取行索引列表
'''
获取行索引列表
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.index)
data

数据分析之Pandas库

  • columns:获取列索引列表
'''
获取列索引列表
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.columns)
data

数据分析之Pandas库

  • values:获取数组的值
'''
获取数组的值
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.values)
data

数据分析之Pandas库

  • T:转置
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data.T

数据分析之Pandas库

  • head(n):查看前n行,如果不传入n,默认是5行。如果数据没有5行,则默认查看所有行。
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data.head(4)

数据分析之Pandas库

  • tail(n):查看后n行,如果不传入n,默认是5行。如果数据没有5行,则默认查看所有行。
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data.tail(2)

数据分析之Pandas库
DataFrame索引的设置:

  • 修改行列索引值
'''
必须整体全部修改,不能使用索引方式改局部,如data.index[0] = '学生_1'
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
stu1 = ['学生_'+str(i+1) for i in range(score_df.shape[0])]
data.index = stu1
data

数据分析之Pandas库

  • 重设索引
'''
使用reset_index(drop=False),可以用来设置新的下标索引,drop:默认是False,不删除原来的索引,如果为True,删除原来的索引值
不删除原来的索引
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data = data.reset_index()
data

数据分析之Pandas库

'''
使用reset_index(drop=False),可以用来设置新的下标索引,drop:默认是False,不删除原来的索引,如果为True,删除原来的索引值
删除原来的索引
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['语文', '数学', '英语', '历史', '政治', '数学']
stu = ['学生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data = data.reset_index(drop=True)
data

数据分析之Pandas库

  • 以某列值设置为新的索引
'''
设置新的索引:set_index(keys, drop=True)
keys:列索引名称或列索引名称的列表
drop:boolean类型,默认是True,当做新的索引,删除原来的列
以月份设置新的索引
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017,2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index('month') # 设置单个索引
df

数据分析之Pandas库

'''
设置新的索引:set_index(keys, drop=True)
keys:列索引名称或列索引名称的列表
drop:boolean类型,默认是True,当做新的索引,删除原来的列
以年份和月份设置新的索引
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month']) # 设置多个索引,要使用列表
df

数据分析之Pandas库

DataFrame通过修改可以变成MultiIndex结构。

➢ MultiIndex结构

MultiIndex是三维的数据结构,即多级索引,也称为层次化的索引。层次化索引是pandas的重要功能,可以在Series、DataFrame对象上拥有2个及其以上的索引。除了通过修改DataFrame数据结构变成MulitiIndex结构,还可以直接创建。

MultiIndex的创建:

import pandas as pd
arrays = [['thanlon', 'kiku', 'kili'], [22, 23, 24]]
pd.MultiIndex.from_arrays(arrays=arrays, names=('name', 'age'))

数据分析之Pandas库
MultiIndex的特性:

'''
index
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index

数据分析之Pandas库

'''
index.names
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.names

数据分析之Pandas库

import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.levels

数据分析之Pandas库

import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.codes

数据分析之Pandas库
➢ Panel结构(Panel已被废弃,这里只作了解)

Panel是MultiIndex的前身,Panel的创建:

'''
pandas.Panel(data-None, items=None, major_axis=None, minor_axis=None):存储3维数组的Panel结构
data:ndarray或者DataFrame,表示整体的数据
items:索引或类似数组的对象,axis=0
major_axis:索引或类似数组的对象,axis=1
minor_axis:索引或类似数组的对象,axis=2
'''
import pandas as pd
import numpy as np
# 24个数,第一个维度是4,第二个维度是3,第三个维度是2,三维
data = np.arange(24).reshape(4, 3, 2)
items = list('ABCD')  # ['A', 'B', 'C', 'D']
major_axis = pd.date_range('20200227', periods=3) # DatetimeIndex(['2020-02-27', '2020-02-28', '2020-02-29'], dtype='datetime64[ns]', freq='D')
minor_axis = ['first', 'second']
pd.Panel(data=data, items=items, major_axis=major_axis, minor_axis=minor_axis)

数据分析之Pandas库
Panel数据的查看:

 import pandas as pd
import numpy as np
# 24个数,第一个维度是4,第二个维度是3,第三个维度是2,三维
data = np.arange(24).reshape(4, 3, 2)
items = list('ABCD')  # ['A', 'B', 'C', 'D']
major_axis = pd.date_range('20200227', periods=3) # DatetimeIndex(['2020-02-27', '2020-02-28', '2020-02-29'], dtype='datetime64[ns]', freq='D')
minor_axis = ['first', 'second']
p = pd.Panel(data=data, items=items,
             major_axis=major_axis, minor_axis=minor_axis)
p[:, :, 'first']  # :表示取所有
p['A', :, :]
4 基本数据操作

➢ 索引操作

直接使用行列索引(先行后列):

结合loc或者iloc使用索引:

使用ix组合索引:

5 DataFrame运算
6 Pandas绘图

➢ Pandas.Series绘图

绘制折线图:

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='line')  # s.plot.line(),s.plot()函数的参数kind默认是'line'

数据分析之Pandas库
绘制柱状图:

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='bar')

数据分析之Pandas库

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='barh')

数据分析之Pandas库
绘制直方图:

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
data = np.random.normal(1.75, 1, 10000) 
s = pd.Series(data=data)
print(s)
s.plot(kind='hist')

数据分析之Pandas库
➢ Pandas.DataFrame绘图

绘制折线图:

import pandas as pd
import numpy as np
data = np.random.randn(10, 2)  # 从标准动态分布中返回一个或多个样本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='line')  # df.plot()函数的参数kind默认是'line'

数据分析之Pandas库
绘制柱状图:

import pandas as pd
import numpy as np
data = np.random.randn(10, 3)  # 从标准动态分布中返回一个或多个样本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='bar')  # df.plot.line(),df.plot()函数的参数kind默认是'line'

数据分析之Pandas库

import pandas as pd
import numpy as np
data = np.random.randn(10, 3)  # 从标准动态分布中返回一个或多个样本值
df = pd.DataFrame(data=data)
df.plot(kind='barh')  # df.plot()函数的参数kind默认是'line'

数据分析之Pandas库
绘制直方图:

import pandas as pd
import numpy as np
data = np.random.randn(10, 3)  # 从标准动态分布中返回一个或多个样本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='hist')  # df.plot()函数的参数kind默认是'line'

数据分析之Pandas库

7 文件读取与存储

➢ CSV格式文件的读取与存储

test.csv:
数据分析之Pandas库
CSV格式文件的读取:

'''
读取数据,并且指定只获取age和addr指标
'''
import pandas as pd
pd.read_csv(filepath_or_buffer='test.csv')
# filepath_or_buffer:文件路径;usecols:指定读取的列名;sep:默认是以逗号分割
pd.read_csv(filepath_or_buffer='test.csv', usecols=['name', 'age'], sep=',')

数据分析之Pandas库
CSV格式文件的存储:

'''
存储数据
'''
import pandas as pd
data = pd.read_csv(filepath_or_buffer='test.csv',
                   usecols=['name', 'age'], sep=',')
# to_csv的参数,columns:选择需要的列索引;header:是否写进列索引值,默认是True;index:是否写进索引,默认是True。mode:重写(w)与追加(a)
data.to_csv(path_or_buf='tmp.csv', columns=[
            'name'], header=True, index=None, mode='w')
data = pd.read_csv(filepath_or_buffer='tmp.csv')
data

数据分析之Pandas库

'''
存储数据,不保存索引
'''
import pandas as pd
data = pd.read_csv(filepath_or_buffer='test.csv', usecols=['name', 'age'], sep=',') # 
data.to_csv(path_or_buf='tmp.csv',columns=['name'],index=False)
data = pd.read_csv(filepath_or_buffer='tmp.csv')
data

数据分析之Pandas库
➢ HDF5格式文件的读取与存储

创建HDF5文件:

首先安装h5py模块:thanlon@thanlon-master:~$ sudo pip3 install h5py -i https://pypi.tuna.tsinghua.edu.cn/simple

创建好的HDF5文件:

import h5py
f = h5py.File('hd.h5', 'w')
lst1 = ['thanlon', 'kiku', 'kili']
column_01 = []
for i in lst1:
    column_01.append(i.encode())
f['name'] = column_01
f['age'] = [11,22,23]
print(f.keys())
print(f['name'][:])
print(f['age'][:])
f.close()

HDF5格式文件的读取:

# 安装tables模块,sudo pip3 install tables -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
data = pd.read_hdf('hd.h5')
data.head()

HDF5格式文件的存储:

import pandas as pd
data = pd.read_hdf('hd.h5')
data.to_hdf('hd.h5', key='data')  # 注意这里必须有要有key
pd.read_hdf('hd.h5', key='data')

HDF5在存储的时候,使用的方式blosc,这种方式是速度读取快,也是pandas默认支持的。使用压缩提高磁盘利用率节省空间。HDF5还是跨平台的,可以轻松迁移到hadoop上面。

➢ JSON格式文件的读取与存储

JSON格式文件的读取:


JSON格式文件的存储:


本文地址:https://blog.csdn.net/Thanlon/article/details/107097106