Pandas库(名字取自其基本数据结构Panel,DataFrame,Series的前几个字母)是一个非常强大的数据处理和可视化库,支持从外部导入数据、数据统计分析、可视化及数据导出。
我们可以通过在命令行提示符cmd(对于Windows系统)或者终端Terminal(对于Mac系统)使用下述命令安装Matplotlib:
pip install pandas
如果已经是使用Anaconda作为编程集成环境,那电脑中已经装好该库了,无需再次安装。
一般我们在使用时会将其简写为pd
import pandas as pd
在绘图时我们往往也会结合Matplotlib库一起使用。
可以通过pd.read_csv
pd.read_excel
的方式导入外部的csv数据和excel数据,支持相对位置和绝对位置,比如我们引入一个外部的csv文件。
car = pd.read_csv('data/car-sales.csv')
data/car-sales.csv
表示的是相对于现在所运行文件的相对位置。
导入的数据自动转换为DataFrame
数据格式。
DataFrame
¶可以通过字典生成DataFram
,比如生成一个名字为'car'的DataFrame
make=['Toyota', 'Honda', 'Toyota', 'BMW', 'Nissan', 'Toyota', 'Honda', 'Honda', 'Toyota', 'Nissan'] # 汽车生产商
color = ['White', 'Red', 'Blue', 'Black', 'White', 'Green', 'Blue', 'Blue', 'White', 'White'] # 汽车颜色
odometer = [150043, 87899, 32549, 11179, 213095, 99213, 45698, 54738, 60000, 31600] # 里程
doors = [4, 4, 3, 5, 4, 4, 4, 4, 4, 4] # 车门数量
price = ['$4,000.00', '$5,000.00', '$7,000.00', '$22,000.00', '$3,500.00', '$4,500.00', '$7,500.00', '$7,000.00', '$6,250.00', '$9,700.00']
car = pd.DataFrame({'Make':make, 'Colour':color, 'Odometer (KM)':odometer, 'Doors':doors, 'Price':price})
这里呈现的是Jupyter notebook 中呈现的效果:
Pandas可以很方便地对数据进行分析,使用describe
方法:
car.describe()
可以看到两个指标的各种常用的统计量了。不过这里默认只对定量数据进行描述,如果想要对定性数据进行描述,可以设定include
参数:
car.describe(include=['object', 'float', 'int'])
这里对定性定量数据都进行了描述,不过有的只有定性数据有的特点,定量数据那里显示的是NaN
(not a number)即是空值
,反之亦然:
可以通过类似于字典索引的方式,直接在DataFrame后面加中括号的形式进行指定列的索引
car['Price'] # 提取Price这一列
car[['Make','Colour']] # 提取Make,Colour这两列
loc
与iloc
的使用方法¶loc
是对索引名和列名进行索引的,iloc
是对索引位置和列名位置进行索引的,这两个方法都需要输入两个参数,前一个为行,后一个为列。举例来看,我想要对上述数据第二行(索引名为1,索引位置也为1),第三列(索引名为'Odometer (KM)',列索引位置为2)的数据87889这个数据进行提取,我可以使用下面等价的两种代码形式:
car.loc[1,'Odometer (KM)']
或者
car.loc[1,2]
如果我们要提取某一行或某一列,可以使用:
来表示所有
,比如我要提取第三列,就可以是:
car.loc[:,'Odometer (KM)']
或者
car.loc[:,2]
apply
的用法¶可以通过apply
对某列数据施加某个函数,使得某列发生整体变化。比如上述数据中Price
这一列并不是数值形式的值,我们现在希望将其美元符号$
去掉,逗号','去掉,同时转换为浮点型float
数据我们就可以利用apply方法:
def to_num(x):
x_new = x.replace('','') # 去掉美元符号
x_new = x_new.replace(',','') # 去掉逗号,
return float(x_new) # 返回浮点数
接下来使用apply
方法对Price这一列进行整体转换
car['Price'].apply(to_num)
即可。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
car = pd.read_csv('data/car-sales.csv')
car
Make | Colour | Odometer (KM) | Doors | Price | |
---|---|---|---|---|---|
0 | Toyota | White | 150043 | 4 | $4,000.00 |
1 | Honda | Red | 87899 | 4 | $5,000.00 |
2 | Toyota | Blue | 32549 | 3 | $7,000.00 |
3 | BMW | Black | 11179 | 5 | $22,000.00 |
4 | Nissan | White | 213095 | 4 | $3,500.00 |
5 | Toyota | Green | 99213 | 4 | $4,500.00 |
6 | Honda | Blue | 45698 | 4 | $7,500.00 |
7 | Honda | Blue | 54738 | 4 | $7,000.00 |
8 | Toyota | White | 60000 | 4 | $6,250.00 |
9 | Nissan | White | 31600 | 4 | $9,700.00 |
car.values
array([['Toyota', 'White', 150043, 4, '$4,000.00'], ['Honda', 'Red', 87899, 4, '$5,000.00'], ['Toyota', 'Blue', 32549, 3, '$7,000.00'], ['BMW', 'Black', 11179, 5, '$22,000.00'], ['Nissan', 'White', 213095, 4, '$3,500.00'], ['Toyota', 'Green', 99213, 4, '$4,500.00'], ['Honda', 'Blue', 45698, 4, '$7,500.00'], ['Honda', 'Blue', 54738, 4, '$7,000.00'], ['Toyota', 'White', 60000, 4, '$6,250.00'], ['Nissan', 'White', 31600, 4, '$9,700.00']], dtype=object)
print(car['Price'].to_list())
['$4,000.00', '$5,000.00', '$7,000.00', '$22,000.00', '$3,500.00', '$4,500.00', '$7,500.00', '$7,000.00', '$6,250.00', '$9,700.00']
pd.DataFrame({'a':[1,2],'b':[2,3]})
a | b | |
---|---|---|
0 | 1 | 2 |
1 | 2 | 3 |
car.columns
Index(['Make', 'Colour', 'Odometer (KM)', 'Doors', 'Price'], dtype='object')
make=['Toyota', 'Honda', 'Toyota', 'BMW', 'Nissan', 'Toyota', 'Honda', 'Honda', 'Toyota', 'Nissan'] # 汽车生产商
color = ['White', 'Red', 'Blue', 'Black', 'White', 'Green', 'Blue', 'Blue', 'White', 'White'] # 汽车颜色
odometer = [150043, 87899, 32549, 11179, 213095, 99213, 45698, 54738, 60000, 31600] # 里程
doors = [4, 4, 3, 5, 4, 4, 4, 4, 4, 4] # 车门数量
price = ['$4,000.00', '$5,000.00', '$7,000.00', '$22,000.00', '$3,500.00', '$4,500.00', '$7,500.00', '$7,000.00', '$6,250.00', '$9,700.00']
car = pd.DataFrame({'Make':make, 'Colour':color, 'Odometer (KM)':odometer, 'Doors':doors, 'Price':price})
print(car.to_markdown())
| | Make | Colour | Odometer (KM) | Doors | Price | |---:|:-------|:---------|----------------:|--------:|:-----------| | 0 | Toyota | White | 150043 | 4 | $4,000.00 | | 1 | Honda | Red | 87899 | 4 | $5,000.00 | | 2 | Toyota | Blue | 32549 | 3 | $7,000.00 | | 3 | BMW | Black | 11179 | 5 | $22,000.00 | | 4 | Nissan | White | 213095 | 4 | $3,500.00 | | 5 | Toyota | Green | 99213 | 4 | $4,500.00 | | 6 | Honda | Blue | 45698 | 4 | $7,500.00 | | 7 | Honda | Blue | 54738 | 4 | $7,000.00 | | 8 | Toyota | White | 60000 | 4 | $6,250.00 | | 9 | Nissan | White | 31600 | 4 | $9,700.00 |
car
Make | Colour | Odometer (KM) | Doors | Price | |
---|---|---|---|---|---|
0 | Toyota | White | 150043 | 4 | $4,000.00 |
1 | Honda | Red | 87899 | 4 | $5,000.00 |
2 | Toyota | Blue | 32549 | 3 | $7,000.00 |
3 | BMW | Black | 11179 | 5 | $22,000.00 |
4 | Nissan | White | 213095 | 4 | $3,500.00 |
5 | Toyota | Green | 99213 | 4 | $4,500.00 |
6 | Honda | Blue | 45698 | 4 | $7,500.00 |
7 | Honda | Blue | 54738 | 4 | $7,000.00 |
8 | Toyota | White | 60000 | 4 | $6,250.00 |
9 | Nissan | White | 31600 | 4 | $9,700.00 |
car.describe(include=['object', 'float', 'int'])
Make | Colour | Odometer (KM) | Doors | Price | |
---|---|---|---|---|---|
count | 10 | 10 | 10.000000 | 10.000000 | 10 |
unique | 4 | 5 | NaN | NaN | 9 |
top | Toyota | White | NaN | NaN | $7,000.00 |
freq | 4 | 4 | NaN | NaN | 2 |
mean | NaN | NaN | 78601.400000 | 4.000000 | NaN |
std | NaN | NaN | 61983.471735 | 0.471405 | NaN |
min | NaN | NaN | 11179.000000 | 3.000000 | NaN |
25% | NaN | NaN | 35836.250000 | 4.000000 | NaN |
50% | NaN | NaN | 57369.000000 | 4.000000 | NaN |
75% | NaN | NaN | 96384.500000 | 4.000000 | NaN |
max | NaN | NaN | 213095.000000 | 5.000000 | NaN |
car.describe()
Odometer (KM) | Doors | |
---|---|---|
count | 10.000000 | 10.000000 |
mean | 78601.400000 | 4.000000 |
std | 61983.471735 | 0.471405 |
min | 11179.000000 | 3.000000 |
25% | 35836.250000 | 4.000000 |
50% | 57369.000000 | 4.000000 |
75% | 96384.500000 | 4.000000 |
max | 213095.000000 | 5.000000 |
def to_num(x):
x_new = x.replace('$','') # 去掉$符号
x_new = x_new.replace(',','') # 去掉逗号,
return float(x_new) # 返回浮点数
car['Price'].apply(to_num)
0 4000.0 1 5000.0 2 7000.0 3 22000.0 4 3500.0 5 4500.0 6 7500.0 7 7000.0 8 6250.0 9 9700.0 Name: Price, dtype: float64
test.replace('$','')
'2,700.000'
test.replace(',','')
'$2700.000'