![](https://img.haomeiwen.com/i7289495/4c271b3ac911c334.png)
一、Numpy
NumPy库名字来源于“Numerical Python” 的缩写。
1.1、数组的概念
a为定义的一个列表,b为定义的一个数组。
import numpy as np
a = [1, 2, 3, 4, 5] # 定义一个列表
b = np.array([1, 2, 3, 4, 5]) # 定义一个数组
![](https://img.haomeiwen.com/i7289495/250e32455d713c27.png)
![](https://img.haomeiwen.com/i7289495/884d3662f55a25a6.png)
![](https://img.haomeiwen.com/i7289495/1199c8580f8dfbf7.png)
1.2、数据list和列表ndarray的区别
![](https://img.haomeiwen.com/i7289495/862e6c896f60f0f9.png)
![](https://img.haomeiwen.com/i7289495/f7f21cb1cf384673.png)
总结: 数组和列表的区别,相同的索引机制,但是数组的元素通过空格隔开,列表的元素通过逗号隔开。
为什么数据分析选用数组ndarray而不用列表?看两个栗子。
1.2.1、让数组和列表都同时乘以2运算
![](https://img.haomeiwen.com/i7289495/1f0d349f1b83a245.png)
![](https://img.haomeiwen.com/i7289495/e48ad7c5be759f6e.png)
总结: 列表list乘以2后只是将数据复制了一遍,而数组ndarray则是将其中的每个元素都乘以了2。那么在实际运用中,ndarray更能满足我们对于数学运算的需求。
1.2.2、让数组和列表都存储3个小列表
a = [[1,2,3], [4,5,6], [7,8,9]]
b = np.array([[1,2,3], [4,5,6], [7,8,9]])
![](https://img.haomeiwen.com/i7289495/c326f3b50ac3812a.png)
![](https://img.haomeiwen.com/i7289495/fd4c886ea0559439.png)
总结:列表list虽然包含3个小列表,但是结构是一维的。数组ndarray则是3行3列的三维结构,列表list只能存储一维结构,数组ndarray能存储二维,三维,甚至多维的结构。
以上两点就是为什么数据分析中使用数组ndarray而不是列表list的主要原因。
1.3、创建数组的方式
创建一维数组
![](https://img.haomeiwen.com/i7289495/dab46adf0f3430ee.png)
创建二维数据
![](https://img.haomeiwen.com/i7289495/7b35786be652a38a.png)
通过np.arange创建
![](https://img.haomeiwen.com/i7289495/f75198d111e26cf3.png)
![](https://img.haomeiwen.com/i7289495/0904f61adeb35411.png)
![](https://img.haomeiwen.com/i7289495/bcd9cac85cf7a7a1.png)
通过随机数创建
![](https://img.haomeiwen.com/i7289495/5417dda90ed63f45.png)
![](https://img.haomeiwen.com/i7289495/87b5934230b50f2b.png)
需要注意的是:通过np.random.rand() 生成的随机数都在0~1的范围之内。
通过arange()创建
![](https://img.haomeiwen.com/i7289495/d3b33095b5f1eb44.png)
通过随机整数二维数组创建
![](https://img.haomeiwen.com/i7289495/71df69ed669f40d2.png)
二、pandas
pandas库是基于NumPy库的一个开源Python库,名字来源于 “panel data”(面板数据)。pandas库提供了非常直观的数据结构和强大的数据处理功能。
2.1、二维数据表格DataFrame的创建
2.1.1、通过列表创建
![](https://img.haomeiwen.com/i7289495/b0bfa6eecdaca734.png)
总结:pandas库中的DataFrame更像Excel中的二维表格数据,有行索引和列索引。需要注意的是,索引都是从0开始的。
定义行索引和列索引:
![](https://img.haomeiwen.com/i7289495/9788a0c3e4caf6ee.png)
通过空 DataFrame创建:
![](https://img.haomeiwen.com/i7289495/3be06713927e5548.png)
2.1.2、通过字典创建DataFrame
![](https://img.haomeiwen.com/i7289495/baad44637913270b.png)
通过from_dict()函数创建
![](https://img.haomeiwen.com/i7289495/12a7838ffff5773b.png)
可以看到,通过from_dict()把字典键变成了行索引,参数orient指定字典键为列索引还是行索引,默认值为columns,即默认字典键为列索引,如果设置成index,则表示字典键为行索引。
通过.T转置:
![](https://img.haomeiwen.com/i7289495/5f6d936f9f26dd69.png)
总结:.T (转置)的效果和 orient='index'的效果一样。
2.1.3、通过二维数据创建DataFrame:
![](https://img.haomeiwen.com/i7289495/23ae91519a447f77.png)
修改行索引和列索引:
![](https://img.haomeiwen.com/i7289495/4cab3296c1ab1d3f.png)
查看index的值:
![](https://img.haomeiwen.com/i7289495/5c384f288dc90de6.png)
将行索引改成某列内容:
![](https://img.haomeiwen.com/i7289495/4ee40848e2029674.png)
改成数字索引:
![](https://img.haomeiwen.com/i7289495/70220d9d39e97c2a.png)
2.2、Excel文件的读取和写入
2.2.1、文件的读取:
import pandas as pd
data = pd.read_excel('Customer_value.xlsx')
data.head()
![](https://img.haomeiwen.com/i7289495/c4a27f7c1429a40d.png)
参数的设置:
data = pd.read_excel('Customer_value.xlsx', sheet_name=0, encoding='utf-8', delimiter=',')
sheet_name : 表示读取第几张sheet页的表格
delimiter : 表示分割符号
2.2.2、文件的写入
a = pd.DataFrame(np.arange(15).reshape(3,5), index=['张三', '李四', '王五'], columns=['A', 'B', 'C', 'D', 'E'])
a.to_excel('data_test.xlsx')
# 或者
a.to_csv('data_test.csv')
参数的设置:
a.to_excel('data_test.xlsx', columns=['B', 'C'], index=False)
columns : 指定要写入的字段
index = False : 不对行索引index进行写入
2.3、数据的选取与处理
![](https://img.haomeiwen.com/i7289495/76c790690f8018f5.png)
2.3.1、数据的选取
按列选取
![](https://img.haomeiwen.com/i7289495/57109d8ce77ac6d1.png)
![](https://img.haomeiwen.com/i7289495/e618fb5dae47024d.png)
总结:通过 d['col2']选取的是一个一维的Series类型的数据,是不包含columns的,而通过 d[['col2']]返回的是一个二维的表格数据。而要选取多列时,必须要通过列表的方式进行访问,即[['col1', 'col2']]
选取多列:
![](https://img.haomeiwen.com/i7289495/7a674800883ae81b.png)
按行选取
![](https://img.haomeiwen.com/i7289495/e0c6c9f8a6014ec7.png)
选取1到2行,中括号中的数字,是前面的数字包括,后面的数字不包括。
![](https://img.haomeiwen.com/i7289495/b72ed239f4de6707.png)
总结:直接d[1:3] 和 d.iloc[1:3] 的效果是一样的,panda库推荐使用iloc方法,更加直观。
选取前1行:
![](https://img.haomeiwen.com/i7289495/550a8ea0626a302a.png)
选取最后1行:
![](https://img.haomeiwen.com/i7289495/683bc82be5fe66af.png)
注意:head() 和 tail() 括号中的数字如果不填的话,默认是5.
** 按区块选取数据**
![](https://img.haomeiwen.com/i7289495/389d69ea8f56d2f6.png)
![](https://img.haomeiwen.com/i7289495/864b78f787dee714.png)
![](https://img.haomeiwen.com/i7289495/55de514fa61de106.png)
总结:d[['col1', 'col2']][1:3]和d[1:3][['col1', 'col2']],d.iloc[1:3][['col1', 'col2']]三者的选取效果是一样的,不过pandas库官方更推荐用 d.iloc[1:3][['col1', 'col2']]
2.3.2、数据筛选
单条件筛选:
![](https://img.haomeiwen.com/i7289495/c5f1882826324986.png)
多条件筛选:
![](https://img.haomeiwen.com/i7289495/033ee0221b5a669b.png)
2.3.3、整体数据查看
查看数据的行与列的个数:
![](https://img.haomeiwen.com/i7289495/910893445f72e4fe.png)
查看数据的描述性分析:
![](https://img.haomeiwen.com/i7289495/d10dbde9d0f9c76a.png)
查看数据在1%,10%,25% ,50%,75%,90%,99%上的分布:
![](https://img.haomeiwen.com/i7289495/00d69ea29ec0c5a4.png)
查看数据概览:
![](https://img.haomeiwen.com/i7289495/ac06d85130902519.png)
统计某一列的数据的频次:
![](https://img.haomeiwen.com/i7289495/0113edfeeb143f16.png)
2.3.4、数据的运算,排序与删除
数据的运算:
二维数据的行列之间具有广播功能,可以直接进行加减乘除的运算
![](https://img.haomeiwen.com/i7289495/6fbc507e5ebef871.png)
数据的排序:
![](https://img.haomeiwen.com/i7289495/ad931caa7720ba41.png)
参数说明:by用来指定要按哪一列来排序,ascending默认为True,表示升序排序,设置为False则是倒序排序。
![](https://img.haomeiwen.com/i7289495/a675313628bfb5e2.png)
sort_index() 函数表示根据索引来进行排序。
数据的删除:
按列索引删除:
![](https://img.haomeiwen.com/i7289495/6b5e03152979871c.png)
![](https://img.haomeiwen.com/i7289495/b06927d3e6c9f464.png)
需要注意的是,用drop删除时要用a = a.drop进行赋值,这样才能删除成功。如果直接用 a.drop()删除,再去查看a时,是没有真正删除的。如果想不用a=进行赋值的话,可以加上参数 inplace = True,表示在a的基础上进行删除。这和a=赋值是等价的。代码如下:
a.drop(columns=['col2', 'col3'], inplace=True)
a = a.drop(columns=['col2', 'col3'])
# 这两句代码的效果一样
按行索引删除:
![](https://img.haomeiwen.com/i7289495/9103237754531262.png)
行索引中的inplace用法一样,不再说明。
2.4、数据表拼接
pandas提供了merge(),join() ,concat(),append()函数进行拼接,分别介绍。
首先定义2个DataFrame,df1 和 df2:
![](https://img.haomeiwen.com/i7289495/8f916894d7e6da53.png)
![](https://img.haomeiwen.com/i7289495/bc5073a6bc64269d.png)
2.4.1、merge()函数
![](https://img.haomeiwen.com/i7289495/57d1d34bcdc0402b.png)
merge函数不加任何的参数,在默认情况下,是取交集,默认参数how = 'inner' ,内连接。
设置how参数,改成以左表为主表,对右表进行关联:
![](https://img.haomeiwen.com/i7289495/65c48c24c7a26344.png)
以右表为主表,对左表进行关联:
![](https://img.haomeiwen.com/i7289495/47deda60c4be6df7.png)
需要注意的是,以右表为主表关联左表时,左表中没有的数据会用NaN进行填充。
以索引进行合并:
![](https://img.haomeiwen.com/i7289495/912d9e2a55473c86.png)
2.4.2、join函数:
![](https://img.haomeiwen.com/i7289495/5d71cdb5a964e30b.png)
2.4.3、concat函数
![](https://img.haomeiwen.com/i7289495/a53df92a95321740.png)
concat函数默认纵向拼接,没有的数据用NaN进行填充。
2.4.4、append函数
![](https://img.haomeiwen.com/i7289495/4dda29da55d94870.png)
![](https://img.haomeiwen.com/i7289495/32d3109864bc4c56.png)
三、Matplotlib
3.1、绘制折线图
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告
x = [1, 2, 3]
y = [3, 6, 9]
plt.plot(x, y) # 绘制折线图
plt.show() #展示图形
![](https://img.haomeiwen.com/i7289495/306db2ee1fa740e6.png)
import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.plot(x, y2, linestyle='--')
plt.plot(x, y)
plt.show()
![](https://img.haomeiwen.com/i7289495/a1e6418749130e82.png)
3.2、绘制柱形图
import matplotlib.pyplot as plt
x = np.arange(5)
y = [5, 4, 3, 2, 1]
plt.bar(x, y)
plt.show()
![](https://img.haomeiwen.com/i7289495/c7637c208ef799fe.png)
3.3、绘制散点图
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(20)
y = np.random.rand(20)
plt.scatter(x, y)
plt.show()
![](https://img.haomeiwen.com/i7289495/a99de69b06ec8def.png)
3.4、绘制直方图
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000) # 随机生成1000个服从正态分布的数据
plt.hist(data, bins=20, edgecolor='blue')
plt.show()
![](https://img.haomeiwen.com/i7289495/853a7a1243a6027b.png)
3.5、用pandas库绘制图表
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000) # 随机生成1000个服从正态分布的数据
df = pd.DataFrame(data)
df.hist(bins=20, edgecolor='black')
plt.show()
![](https://img.haomeiwen.com/i7289495/22f545816b97193d.png)
import matplotlib.pyplot as plt
import pylab as mpl #导入中文字体,避免显示乱码
mpl.rcParams['font.sans-serif']=['SimHei'] #设置为黑体字
df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '语文':[88, 80, 70], '数学':[100, 95, 90], '外语':[95, 98, 99]})
df.set_index(keys='姓名', inplace=True)
df['数学'].plot(kind='line')
df['数学'].plot(kind='bar')
![](https://img.haomeiwen.com/i7289495/5d01d14da03c29de.png)
df['数学'].plot(kind='pie')
![](https://img.haomeiwen.com/i7289495/8478657e10fd2ebe.png)
df['数学'].plot(kind='box')
![](https://img.haomeiwen.com/i7289495/1d88b0c5123b82ac.png)
3.6、数据可视化常用技巧
3.6.1、添加文字说明:
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告
x = [1, 2, 3]
y = [3, 6, 9]
plt.title('这里是标题')
plt.xlabel('这里是x轴')
plt.ylabel('这里是y轴')
plt.plot(x, y) # 绘制折线图
plt.show() #展示图形
![](https://img.haomeiwen.com/i7289495/4333565e66445285.png)
3.6.2添加图例:
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2')
plt.legend()
plt.show()
![](https://img.haomeiwen.com/i7289495/3ea9ed947f3b6377.png)
3.6.3设置双坐标轴:
import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2')
plt.legend()
plt.twinx() # 设置双坐标轴
plt.show()
![](https://img.haomeiwen.com/i7289495/284a885cb569c2e0.png)
3.6.4设置图表大小:
import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.figure(figsize=(10,5)) # 设置图表大小
# 或者用 plt.rcParams['figure.figsize'] = [10, 5]
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2')
plt.show()
![](https://img.haomeiwen.com/i7289495/4f3353636c6a2c4d.png)
3.6.5设置x轴刻度角度:
import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.xticks(rotation=45) # 设置 x 轴的刻度为45度角
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2')
plt.show()
![](https://img.haomeiwen.com/i7289495/f1439e8ba63cc550.png)
3.6.6解决中文显示问题:
import pylab as mpl #导入中文字体,避免显示乱码
mpl.rcParams['font.sans-serif']=['SimHei'] #设置为黑体字
3.6.7绘制多图:
方式一:
import matplotlib.pyplot as plt
df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '语文':[88, 80, 70], '数学':[100, 95, 90], '外语':[95, 98, 99]})
df.set_index(keys='姓名', inplace=True)
plt.rcParams['figure.figsize'] = [15, 8]
ax1 = plt.subplot(221) # 221分别表示子图的行数,列数,子图的序号
df['数学'].plot(kind='line')
df['数学'].plot(kind='bar')
ax2 = plt.subplot(222)
df['数学'].plot(kind='box')
ax2 = plt.subplot(223)
df['数学'].plot(kind='pie')
ax2 = plt.subplot(224)
df['数学'].plot(kind='area')
plt.show()
![](https://img.haomeiwen.com/i7289495/9337769e9fa37d86.png)
方式二:
import matplotlib.pyplot as plt
df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '语文':[88, 80, 70], '数学':[100, 95, 90], '外语':[95, 98, 99]})
df.set_index(keys='姓名', inplace=True)
fig, axes = plt.subplots(2,2,figsize=(15,8))
ax1, ax2, ax3, ax4 = axes.flatten()
ax1.plot(df['数学'])
ax2.bar([1,2,3], df['数学'])
ax3.scatter([1,2,3], df['数学'])
ax4.pie(df['数学'])
plt.show()
![](https://img.haomeiwen.com/i7289495/0608e8806be54ac5.png)
网友评论