pandas 的特点
可以处理各种类型的数据,而不只是数值数据,可以弥补numpy的不足。
一般常用的类型有:
- Series:一维数据,是一个带标签的数组
- DataFrame:二维数据,是Seris容器
pandas使用概要
Series创建
创建一个Series,并查看其格式:
import pandas as pd
t = pd.Series([i for i in range(5,10)])
print(t,type(t))
运行结果:
0 5
1 6
2 7
3 8
4 9
dtype: int64 <class 'pandas.core.series.Series'>
结果中左边一列为索引(index),右边一列为内容。
如果需要指定索引:
(索引的数量>=数据长度,没有数据的部分pandas自动改为nan,整个Series的类型变为浮点类型。)
方法1.:需要加入index参数(列表):
import pandas as pd
import random as rd
t = pd.Series([range(i) for i in range(5,10)],index=list("abcde"))
print(t)
方法2:通过字典实现
字典的key即索引,值即Series的值
import pandas as pd
dict = {'name':'me', 'age':20, 'num':12345}
t =pd.Series(dict)
print(t)
修改Series数据类型
基本同numpy修改数据类型。
查看类型:series_name.dtype
修改类型:series_name.astype() #传入类型参数,如int/float/str
Series的切片和索引
- 索引
使用以下方法:
(假设索引为index)
#通过值(假设用布尔索引,取值大于n的部分)
series_name[series_name>n]
#通过索引(字符串)
series_name[index]
#通过行数(假设取出第a到b行)
series_name[a-1:b-1]
#取出以列表list_1为行数的一系列Series数据
series_name[list_1]
假设指定索引的部分超出了原有的索引的范围,则输出时超出部分值表示为nan
这边同时引入Series遍历的方法:
for i in series_name:
print(i)
下面给出一些常用方法:
#查看所有index
series_name.index
#查看Series长度
len.(series_name.index)
#将series的index转化成列表并取出部分索引(假设取第三个以后)
list(series_name.index)[:2]
#提取series中所有的值(value)
#此处注意,提取的value以np.array的数组形式出现
series.values
pandas读取数据
一般方法为:
import pandas as pd
pd.read_xxxx(此处可参照提示)
如常用的:
- 读取csv文件:
miport pandas as pd
pd.read_csv('path/file_name')
- 读取excel文件
pd.read_excel('path/file_name')
- 读取数据库
mysql:
pd.read_sql(sql_sentence.connection)
mongoDB:
咱也没学过,待补充
pandas 的dataframe
创建
data是一个array-like类型的数据
pd.DataFrame(data)
输出的不仅有数据,还有行和列的索引。行索引成为index(asis=0),列索引成为columns(axis=1)。
如:
import pandas as pd
import random as rd
import numpy as np
import string
t = pd.DataFrame(np.array([rd.randint(10,20) for i in range(10)]).reshape(2,5),
index=list(string.ascii_uppercase[0:2]),
columns=list(string.ascii_lowercase[0:5]))
print(t)
输出:
a b c d e
a 20 10 18 13 18
b 12 20 10 11 10
同样的,可以用字典来创建DataFrame
但是有缺失值的时候,会出现nan,整个dataframe中的数字都变成了float类型。
在使用爬取到的信息并放入dataframe时,可以直接对信息进行筛选,留下有效信息,如新建一个字典,把需要的信息放入新字典
data_list = {}
for i in data:
new_dict[key1] = i[key1]
new_dict[key2] = i[key2]
...
data_list.append(new_dict)
dataframe的各种属性
dataframe中的属性:
.index:行索引
.colums:列索引
.values:所有值
.shape:行列数
.dtype:每一列的数据类型
.ndim:维度
.head():显示前几行,默认5
.tail():显示末尾几行,默认5
.info():相关信息概览,包括行列数,字段数据类型等
.describe:快速统计
dataframe的排序和切片方法
排序:
df_name.sort_values(by='key_1', ascending=True)
升序排序,by代表用来排序的数据列,ascending代表升序,改为False则是降序。
切片/切片赋值:
取行\列
df_name[:20]
[ ]中直接写数字,即取行。key代表要取的参数名。得到一个新的dataframe,可以在此基础上取列索引,对列进行操作。
如:df_name[:20][key_1]
但是pandas有自己的选择方式
- df_name.loc
通过标签索引行数据
df_name.loc[‘label_1’:‘label_2’, ‘label_3’:‘label_4’]
举例:
注:索引的头和尾都是能够被选中的
import pandas as pd
import random as rd
import numpy as np
import string
#创建一个随机的dataframe
data = np.array([rd.randint(0,20) for i in range(200)]).reshape(50,4)
t = pd.DataFrame(data, columns=list('ABCD'))
#把data中前25行按照'C'中数字升序排列,并显示t_1中的A、C、D三列数据
t_1 = t.loc[0:25,['A','C','D']].sort_values('C',ascending=True)
print(t_1)
结果:
A C D
1 0 0 9
2 8 0 14
15 9 0 13
20 6 0 18
14 8 3 0
19 9 5 5
18 4 5 14
4 8 9 20
11 2 10 16
9 18 11 10
23 6 11 17
22 11 11 19
10 20 12 16
6 6 12 12
16 10 13 17
21 9 13 3
8 13 14 1
7 8 16 14
17 15 17 19
5 8 17 14
3 7 17 13
25 12 17 18
0 4 18 4
24 19 18 15
13 16 20 0
12 12 20 5
- df_nameiloc
通过位置获得行数据
df_name[[行数组], [列数组]]
例:
import pandas as pd
import random as rd
import numpy as np
import string
#创建一个随机的dataframe
data = np.array([rd.randint(0,20) for i in range(200)]).reshape(50,4)
t = pd.DataFrame(data, columns=list('ABCD'))
#显示data中前25行A、C、D三列数据
t_1 = t.iloc[0:25,[0,2,3]]
print(t_1)
结果:
A C D
0 16 1 15
1 15 1 16
2 13 14 13
3 14 11 20
4 6 7 15
5 11 1 13
6 10 14 20
7 4 4 0
8 11 0 19
9 6 20 15
10 18 15 5
11 16 7 5
12 4 11 12
13 17 0 11
14 2 16 1
15 14 4 20
16 8 3 2
17 10 19 14
18 16 5 7
19 7 1 0
20 9 0 17
21 2 14 7
22 9 13 16
23 6 0 0
24 16 16 13