详情请点阅读全文
一、pandas简介
- 具备对其功能的数据结构DataFrame、Series
- 集成时间序列功能
- 提供丰富的数学运算和操作
- 灵活处理缺失数据
2.安装方法:
1 | pip install pandas |
3.引用方法:
1 | import pandas as pd |
二、pandas.Series
- Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。
- Series比较像列表 (数组)和字典的结合体
1.Series创建方式:
1
2
3
4pd.Series([4,7,-5,3]) #S注意大小写
pd.Series([4,7,-5,3],index=['a','b','c,'d'])
pd.Series({'a':1, 'b':2})
pd. Series(0, index=['a,'b','c','d'])
运行实例:
1 | import pandas as pd |
2.获取值数组和索引数组:
values 属性和index属性:
1 | #【调用方式】 |
3.Series特性
2.3.1Series支持NumPy模块的特性(下标) :
sr表示:series
- 从ndarray创建Series: Series(arr)
- 与标量运算: sr*2
- 两个Series运算: sr1+sr2
- 索引: sr[0], sr[[1,2,4]]
- 切片: sr[0:2](切片也是直接改series,不会复制,可用:b=a[0:2].copy())
- 通用函数: np.abs(sr)
- 布尔值过滤: sr[sr>0]
示例:
1 | import numpy as np |
2.3.2Series支持字典的特性(标签) :
- 从字典创建Series: Series(dic),
- in运算: ‘a’in sr
- 键索引: sr[‘a’], sr[[‘a’, ‘b’, ‘d’]]
1 | #【从字典创建】 |
3.整数索引
整数索引(键)的pandas对象比较难
例:
1 | 4.)) sr= pd.Series(np.arange( |
如果索引(键)是整数类型,则根据整数进行数据操作时,总是优先面向标签(键)的,而不是优先用下标索引
- e.loc() #根据标签(键)索引
- e.iloc() #根据下标索引
1 | 1:5,2:4,3:3,4:2,5:1}) e=pd.Series({ |
4.Series数据对齐
pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。
1 | sr1 = pd.Series([12,23,34], index=['a','d','c']) |
如何在两个Series对象相加时将缺失值设为0?
sr1.add(sr2, fill_value=0)
灵活的算术方法: add, sub, div, mul
sr1.sub(sr2,fill_value=11111)
1 | 4),index=list('acde')) s1=pd.Series(range( |
5.缺失数据处理
缺失数据:使用NaN (Not a Number)来表示缺失数据。其值等于np.nan。
内置的None值也会被当做NaN处理。
处理缺失数据的相关方法:
- 扔掉NaN:dropna()
- 挑出 ~isnull() 或 notnull()
- 填充NaN:fillna()
- 过滤缺失数据: sr.dropna()或sr[sr.notnull( )]
- 填充缺失数据: sr.fillna(0)
1 | import pandas as pd |
★三、pandas DataFrame
- DataFrame是一个表格型的数据结构,含有一组有序的列。
- DataFrame可以被看做是由Series组成的字典,并且共用一个索引。
3.1创建方式:
pd.DataFrame({‘one’:[1,2,3],’two’:[7,8,9]})
b=pd.DataFrame({‘one’:pd.Series([‘a’,’b’,’c’],index=[1,2,3]),’two’:pd.Series(range(4,7,1),index=list(‘abc’))})
…
实例:
1 | import pandas as pd |
3.2★CSV文件读取与写入:
读取:df.read_csv(‘filename.csv’)
保存:df.to csv(‘new.csv’)
首先:进入csv目录方法有两种:
- a.在csv目录下【右键——在此处打开命令窗口】
- a.可cd 路径进入(在cmd下)
然后:进入python输入如下
1 | import pandas as pd |
3.3DataFrame查看数据
1.查看数据常用属性及方法:
- index:获取行索引
- T:转置
- columns:获取列索引
- values:获取值数组
- describe():获取快速统计
1 | import pandas as pd |
2.DataFrame各列name属性:列名
- rename(columns={…})
按上一列:
1 | #【给指定列的标题换个新名字】注意,第2、3列标题 |
3.3DataFrame索引和切片
1)DataFrame有行索引和列索引。通过标签获取:
- df[‘A’]
- df[‘A’, ‘B’]]
- df[‘A’][0] 此处0代表是标签(值)‘0’,而不是索引(位置)0,正确要用df[‘A’].iloc[0]
- df[0:10][[‘A’, ‘C’]]
2)因1)方法会导致问题,建议用.loc,iloc(即指定根据标签索引)
- df.loc[:,[‘A’,’B’]] 【行】按索引(位置序号)取值。
- df.loc[:’A:’C’]
- df.loc[0,’A’]
- df.loc[0:10,[‘A’,’C’]]
- df.iloc[0:2,0:2] 【行、列】都按索引(位置序号)取值。(数字来取值)
表格内容:
1 | id date new_open new_close high low volume code |
1) 普通索引示例:
1 | #【date列的第3个值】 |
2)loc、iloc索引示例
df.loc[:,[‘a’,’b’]] 和 df.iloc[0:2,0:2]
1 | #【行按索引,取所有行,date,close列】 |
3)按布尔取值(条件取值)
通过布尔值过滤:
df[df[‘A’]]>0]
df[df[‘A’].isin([1,3,5])]
df[df<0] = 0
1 | #【open列哪些大于18】 |
3.4DataFrame:数据对齐 & 缺失数据
- 【对齐】DataFrame对象在运算时,同样会进行数据对齐,结果的行索引与列索引分别为两个操作数的行索引与列索引的并集。
- DataFrame处理缺失数据的方法:
- dropna(axis=0,where=’any’…)
- fillna()
- isnull()
- notnull()
1) 对齐:
1 | #【两个Df可直接相加,标题相同的列相加后对齐,没有的列数据做NaN处理】 |
2)缺失数据处理
- dropna(axis=0,where=’any’…) #丢掉缺失数据
- fillna() #填充缺失数据为
- isnull() # 判断是不是空
- notnull() #判断是不是不为空
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
42
43
44
45
46
47
48
49
50
51#接上一步a+a2
b=_
#【isnull()】
b.isnull()
close code date high id low open volume
0 False True True False True False False False
1 False True True False True False False False
...
#【notnull()】
b.notnull()
close code date high id low open volume
0 True False False True False True True True
1 True False False True False True True True
#【fillna()】
b
close code date high id low open volume
0 43.138 NaN NaN 30.123 NaN 30.123 40.246 159899
1 45.138 NaN NaN 31.123 NaN 31.123 42.246 159900
2 47.138 NaN NaN 32.123 NaN 32.123 44.246 159901
3 49.138 NaN NaN 33.123 NaN 33.123 46.246 159902
#【nan填充为0.001】
0.001) b.fillna(
close code date high id low open volume
0 43.138 0.001 0.001 30.123 0.001 30.123 40.246 159899
1 45.138 0.001 0.001 31.123 0.001 31.123 42.246 159900
2 47.138 0.001 0.001 32.123 0.001 32.123 44.246 159901
3 49.138 0.001 0.001 33.123 0.001 33.123 46.246 159902
#【dropna()】
#不填参数意思是:把含有nan的行数据全部删除,所以结果将为空表 b.dropna()
Empty DataFrame
Columns: [close, code, date, high, id, low, open, volume]
Index: []
#【加参数:把一行所有数据都为NaN的数据删除】,结果都在,因为没一行是全为NaN的
'all') b.dropna(how=
close code date high id low open volume
0 43.138 NaN NaN 30.123 NaN 30.123 40.246 159899
1 45.138 NaN NaN 31.123 NaN 31.123 42.246 159900
2 47.138 NaN NaN 32.123 NaN 32.123 44.246 159901
...
18 39.569 NaN NaN 48.123 NaN 48.123 38.123 159917
#【axis=0表示看行,=1看列】
'all',axis=1) #结果删除了有NaN的列 b.dropna(how=
close high low open volume
0 43.138 30.123 30.123 40.246 159899
1 45.138 31.123 31.123 42.246 159900
...
18 39.569 48.123 48.123 38.123 159917
4.pandas其它常用方法:
- pandas常用方法(适用Series和DataFrame):
- mean(axis=0,skipna= False)
- sum(axis=1)
- sort_index(axis, .. ascending=true) 按行或列索引排序 (ascending(升序))
- sort_values(by, axis, ascending) 按值排序
- NumPy的通用函数同样适用于pandas
- apply(func, axis=0) 将自定义函数应用在各行或者各列上,func可返回标量或者Series
- applymap(func) 将函数应用在DataFrame各个元素上
- map(func) 将函数应用在Series各个元素上
1 | #按索引列降序排列 |
NumPy的通用函数同样适用于pandas
1 | 'open':'code'] b=a.loc[:, |
5.pandas的层次化索
层次化索引是Pandas的- -项重要功能,它使我们能够在一个轴上拥有多个索引级别。
例: data=pd.Series(np.random.rand(9),index=[[‘a’,’a’,’a’,’b’,’b’,’b’,’c’,’c’,’c’],[1,2,3,1,2,3,1,2,3]])
1 | import numpy as np |
6.padas从文件读取
6.1读取文件:从文件名、URL、文件对象中加载数据
- read_csv 默认分隔符为 逗号
- read_table 默认分隔符为 \t
6.2读取文件函数主要参数:
- sep 指定分隔符,可用正则表达式如’\s+’
- header = None 指定文件无列名
- names 指定列名
- index_col 指定某列作为索引
- skiprows=[1,2,3,4,5] 指定跳过某些行
- na_values 指定某些字符串表示缺失值
- parse_dates 指定某些列是否被解析为日期,布尔值或列表
- nrows 指定读取几行文件
- chunksize 分块读取文件,指定块大小
例
1 | #用sep参数自定义分隔符(read_table通用) |
7.写入到文件各参数(to_csv())
7.1pd.to_csv()写入文件函数的主要参数:
- sep=’/t’ 指定分隔符
- na_rep 指定缺失值转换的字符串,默认为空字符串
- header=False 不输出列名一行
- index=False 不输出行索引一列
- cols=[‘close’,’open’] 指定输出的列,传入列表
其他文件类型: json, XML, HTML,数据库
1 | #【防止写新文件时自动加入新索引列】index=False |
8.pandas时间对象处理
8.1时间序列类型:
- 时间戳:特定时刻
- 固定时期:如2017年7月
- 时间间隔:起始时间-结束时间
8.2Python标准库: datetime
- date time datetime timedelta
- strftime()
- strptime()
8.3第三方包: dateutil
- dateutil.parser.parse()
8.4成组处理日期: pandas:
- pd.to_datetime([‘2001-01-01, 2002-02-02’])
8.5产生时间对象数组: date_range()
- start 开始时间
- end 结束时间
- periods 时间长度
- freq 时间频率,默认为’D’, 可选:
H(our)、W(eek)、B(usiness)-[ 工作日周一-周五]、S(emi-)M(onth)-[半个月]、M(outh)、(min)T(es)、
S(econd)、 A(year)….
1 | import pandas as pd |
8.6pandas时间序列
时间序列就是以时间对象为索引的Series或DataFrame。
datetime对象作为索引时是存储在DatetimeIndex对象中的。
8.6.1时间序列特殊功能:
- 传入“年”或“年月”作为切片方式
- 传入日期范围作为切片方式
1 | import pandas as pd |