Pandas
Python Data Analysis
Pandas 是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
- 1.基于Numpy,基于Matplotlib,把这两个库进行了再封装
- 2.拥有Series,DataFrame两种数据种类型(Series即是一个序列,又是一个hash表)(DataFrame把Series当作是一列)
- 3.在读取文件的操作上更加简便.
In [6]:
代码语言:javascript复制#数据有三剑客
代码语言:javascript复制import numpy as np
代码语言:javascript复制import matplotlib.pyplot as plt
代码语言:javascript复制import pandas as pd
使用pd读取csv文件
代码语言:javascript复制filepath_or_buffer 文件路径
代码语言:javascript复制sep=',' 分割符
代码语言:javascript复制header='infer' 是否有列名称,默认是有,没有写成None
代码语言:javascript复制names=None 如果没有列名,我们可以指定列名,要求是一个序列(['name','sex','age'])
代码语言:javascript复制engine=None 使用C或pythn作为计算引擎(C的速度快,python比较精确) {'c', 'python'}
代码语言:javascript复制skiprows=None 跳过多少行
代码语言:javascript复制nrows=None 取多少行
代码语言:javascript复制skipfooter=0 从尾部跳过
In [7]:
代码语言:javascript复制#DataFrame
代码语言:javascript复制#自动化运维 系统日志 一个文件 60G
代码语言:javascript复制#数据流控制
代码语言:javascript复制AAPL = pd.read_csv('AAPL.csv',sep=',')
In [3]:
代码语言:javascript复制#获取当前数据在内存中占用多少
代码语言:javascript复制AAPL.info()
代码语言:javascript复制<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9759 entries, 0 to 9758
Data columns (total 7 columns):
Date 9759 non-null object
Open 9758 non-null float64
High 9758 non-null float64
Low 9758 non-null float64
Close 9758 non-null float64
Adj Close 9758 non-null float64
Volume 9758 non-null float64
dtypes: float64(6), object(1)
memory usage: 533.8 KB
In [8]:
代码语言:javascript复制AAPL.iloc[:1000,:-1].plot(figsize=(18,10))
Out[8]:
代码语言:javascript复制<matplotlib.axes._subplots.AxesSubplot at 0x269703f21d0>
Series
Series是一个类似于一维数组的对象,由两个部分组成:
- values : 是一个一维的ndarray
- indexs : 是一维的序列
In [11]:
代码语言:javascript复制nd1 = np.random.randint(0,10,10)
是用Series使用 copy = True此时的copy为深拷贝
- 当nd1 为array([1,2,3])时,Series产生的是浅拷贝(只拷贝引用地址,不拷贝对象本身)
- 当nd1 为{}时,为深拷备,或copy = True
In [10]:
代码语言:javascript复制
代码语言:javascript复制S = pd.Series(nd1,index=list('abcdefghij'),copy=True)
代码语言:javascript复制S
Out[10]:
代码语言:javascript复制a 9
b 6
c 2
d 6
e 7
f 5
g 8
h 7
i 8
j 3
dtype: int32
In [7]:
代码语言:javascript复制#Series中会出现 引用传地址问题
代码语言:javascript复制nd1[0] = 1000
代码语言:javascript复制S[0]
Out[7]:
代码语言:javascript复制6
In [8]:
代码语言:javascript复制#对象.属性
代码语言:javascript复制S.a
Out[8]:
代码语言:javascript复制6
In [9]:
代码语言:javascript复制#key
代码语言:javascript复制S['a']
Out[9]:
代码语言:javascript复制6
In [10]:
代码语言:javascript复制#索引
代码语言:javascript复制S[0]
Out[10]:
代码语言:javascript复制6
序列类型的索引
In [11]:
代码语言:javascript复制nd1
Out[11]:
代码语言:javascript复制array([1000, 6, 2, 7, 5, 4, 9, 1, 3, 2])
In [12]:
代码语言:javascript复制nd1[[0,1,0]]
Out[12]:
代码语言:javascript复制array([1000, 6, 1000])
In [13]:
代码语言:javascript复制S[[0,1,2,0,1]]
Out[13]:
代码语言:javascript复制a 6
b 6
c 2
a 6
b 6
dtype: int64
条件查询
条件查询返回倒是索引
In [14]:
代码语言:javascript复制np.where(nd1>5) #返回的是元组
Out[14]:
代码语言:javascript复制(array([0, 1, 3, 6]),)
In [15]:
代码语言:javascript复制indexs = np.argwhere(nd1>5).ravel() # 返回的是array二维数组,用ravel降维
In [16]:
代码语言:javascript复制nd1[indexs]
Out[16]:
代码语言:javascript复制array([1000, 6, 7, 9])
代码语言:javascript复制pd当中,目前没有搜索方法,pd是基于(继承)numpy的
In [17]:
代码语言:javascript复制cond = np.argwhere(S > 5).ravel()
In [18]:
代码语言:javascript复制S[cond]
Out[18]:
代码语言:javascript复制a 6
b 6
d 7
g 9
dtype: int64
代码语言:javascript复制利用广播机制,返回bool值
In [19]:
代码语言:javascript复制bls = S>5
In [20]:
代码语言:javascript复制#只匹配返回结果为True的
代码语言:javascript复制S[bls]
Out[20]:
代码语言:javascript复制a 6
b 6
d 7
g 9
dtype: int64
显示索引&隐式索引
- 显示索引 .loc[] 只能使用关联型的索引取值,是一个闭区间,适合查找一个指定的值
- 隐式索引 .iloc[] 只能使用枚举型的索引取值,是一个半闭区间,适合查找一个范围的值
In [45]:
代码语言:javascript复制#离散类型的 : 关联型
代码语言:javascript复制S['a':'j']
. . .
In [46]:
代码语言:javascript复制#连续类型的 : 枚举型
代码语言:javascript复制S[0:]
. . .
In [37]:
代码语言:javascript复制S.loc['a']
Out[37]:
代码语言:javascript复制6
In [44]:
代码语言:javascript复制S.iloc[0:]
. . .
DataFrame
DataFrame是一个类似于表格的二维数据结构,分为行(indexs)和列(columns),由多个Series组成的,每一列是一个Series
- dtypes 检查每一列的数据类型
- columns 获取列的名称
- index 获取行号
- shape 查看形状
- values 或值的部分,得到的是一个二维矩阵
In [50]:
代码语言:javascript复制AAPL.dtypes
Out[50]:
代码语言:javascript复制Date object
Open float64
High float64
Low float64
Close float64
Adj Close float64
Volume float64
dtype: object
In [65]:
代码语言:javascript复制AAPL.columns
Out[65]:
代码语言:javascript复制Index(['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')
In [75]:
代码语言:javascript复制AAPL.index
Out[75]:
代码语言:javascript复制RangeIndex(start=0, stop=9759, step=1)
In [77]:
代码语言:javascript复制AAPL.shape
Out[77]:
代码语言:javascript复制(9759, 7)
In [78]:
代码语言:javascript复制AAPL.values
Out[78]:
代码语言:javascript复制array([['1980-12-12', 0.513393, 0.515625, ..., 0.513393,
0.40897100000000003, 117258400.0],
['1980-12-15', 0.488839, 0.488839, ..., 0.48660699999999996,
0.387633, 43971200.0],
['1980-12-16', 0.453125, 0.453125, ..., 0.45089300000000004,
0.359183, 26432000.0],
...,
['2019-08-22', 213.190002, 214.440002, ..., 212.460007,
212.460007, 22253700.0],
['2019-08-23', 209.429993, 212.05000299999998, ..., 202.639999,
202.639999, 46818000.0],
['2019-08-26', 205.860001, 207.190002, ..., 206.490005,
206.490005, 26043600.0]], dtype=object)
DataFrame的索引
- head() 默认读取前5行
- tail() 默认读取后5行
In [85]:
代码语言:javascript复制AAPL.head()
Out[85]:
Date | Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|---|
0 | 1980-12-12 | 0.513393 | 0.515625 | 0.513393 | 0.513393 | 0.408971 | 117258400.0 |
1 | 1980-12-15 | 0.488839 | 0.488839 | 0.486607 | 0.486607 | 0.387633 | 43971200.0 |
2 | 1980-12-16 | 0.453125 | 0.453125 | 0.450893 | 0.450893 | 0.359183 | 26432000.0 |
3 | 1980-12-17 | 0.462054 | 0.464286 | 0.462054 | 0.462054 | 0.368074 | 21610400.0 |
4 | 1980-12-18 | 0.475446 | 0.477679 | 0.475446 | 0.475446 | 0.378743 | 18362400.0 |
In [94]:
代码语言:javascript复制#dataframe 的中括号只能取 列的名称
代码语言:javascript复制#如果索引是字符串类型,返回一个Series
代码语言:javascript复制#如果索引是序列类型,返回一个Dataframe
代码语言:javascript复制AAPL['Date']
. . .
In [97]:
代码语言:javascript复制#dataframe 的中括号切片 切的行
代码语言:javascript复制#返回的都是一个Dataframe
代码语言:javascript复制AAPL[0:100]
. . .
DataFrame的显示和隐式索引 (先取行,再取列)
In [113]:
代码语言:javascript复制AAPL
. . .
In [107]:
代码语言:javascript复制#DateFrame中显示索引loc如果没有关联型的索引,那么显示取值取枚举类型
代码语言:javascript复制AAPL.loc[0,'Date']
Out[107]:
代码语言:javascript复制'1980-12-12'
In [119]:
代码语言:javascript复制AAPL.loc[:10,:'High']
. . .
In [115]:
代码语言:javascript复制AAPL.iloc[:10,:2]
. . .
创建一个Dataframe
- pd.DataFrame(data,index,columns)
In [196]:
代码语言:javascript复制df = pd.DataFrame(data={'A':[1,2,3,4,5],'B':[5,6,7,8,9],'C':[11,12,13,14,15]},
代码语言:javascript复制 index=['西毒','绿帝','北丐','东邪','中李野'],
代码语言:javascript复制 columns=['A','B','C','D'])
代码语言:javascript复制df
Out[196]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | NaN |
绿帝 | 2 | 6 | 12 | NaN |
北丐 | 3 | 7 | 13 | NaN |
东邪 | 4 | 8 | 14 | NaN |
中李野 | 5 | 9 | 15 | NaN |
In [139]:
代码语言:javascript复制df1 = pd.DataFrame(np.random.randint(1,100,size=(5,3)),columns=['体育','音乐','生物'])
代码语言:javascript复制df1
Out[139]:
体育 | 音乐 | 生物 | |
---|---|---|---|
0 | 73 | 14 | 53 |
1 | 32 | 39 | 44 |
2 | 97 | 87 | 15 |
3 | 1 | 32 | 37 |
4 | 44 | 1 | 86 |
In [146]:
代码语言:javascript复制#取除生物列
代码语言:javascript复制df1['生物']
代码语言:javascript复制df1.iloc[:,2]
代码语言:javascript复制df1.loc[:,'生物']
代码语言:javascript复制df1.生物
Out[146]:
代码语言:javascript复制0 53
1 44
2 15
3 37
4 86
Name: 生物, dtype: int64
In [148]:
代码语言:javascript复制#取出音乐的第二行
代码语言:javascript复制df1.loc[1,'音乐']
Out[148]:
代码语言:javascript复制39
DateFrame的CURD
增加:¶
- df.loc['李晶'] = ['东北','男',1045,np.NaN] 删除:
- df.drop(labels=['中李野','李晶'],axis=0,inplace=True) 改 :
- indexs = df.query("A == '东北'").index
- s = df.loc[indexs]
- s['D'] = 'ABC'
- df.loc[indexs] = s
- df 查:
- df.query("B == '男' | C>5 ")
In [162]:
代码语言:javascript复制#C insert
代码语言:javascript复制df
Out[162]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | NaN |
绿帝 | 2 | 6 | 12 | NaN |
北丐 | 3 | 7 | 13 | NaN |
东邪 | 4 | 8 | 14 | NaN |
中李野 | 5 | 9 | 15 | NaN |
李晶 | 东北 | 男 | 1045 | NaN |
In [197]:
代码语言:javascript复制
代码语言:javascript复制# df.insert()
代码语言:javascript复制#插入
代码语言:javascript复制df.loc['李晶'] = ['东北','男',1045,np.NaN]
In [198]:
代码语言:javascript复制#查询 B='男' and C>10
代码语言:javascript复制#查询 B列中 = ‘男’
代码语言:javascript复制cond = df.loc[:,'B'] == '男'
In [216]:
代码语言:javascript复制#先筛选出第一个条件
代码语言:javascript复制cond_c = df[cond].loc[:,'C'] > 5
In [217]:
代码语言:javascript复制df[cond][cond_c]
Out[217]:
A | B | C | D | |
---|---|---|---|---|
李晶 | 东北 | 男 | 1045 | NaN |
In [12]:
代码语言:javascript复制
代码语言:javascript复制#query()
代码语言:javascript复制df.query("B == '男' | C>5 ")
代码语言:javascript复制---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-12-1c83fd6081c3> in <module>()
1 #query()
----> 2 df.query("B == '男' | C>5 ")
NameError: name 'df' is not defined
更改
- 找到要更改数据的index
- 根据索引找到该条数据
- 修改数据
- 将修改过的这条数据(res)赋值给本表格下的那条数据(df.loc[indexs])
In [236]:
代码语言:javascript复制#update
代码语言:javascript复制#把 set D='ABC' where A = '东北'
代码语言:javascript复制
代码语言:javascript复制
代码语言:javascript复制indexs = df.query('A == "东北"').index
In [242]:
代码语言:javascript复制res = df.loc[indexs]
In [244]:
代码语言:javascript复制res['D'] = 'ABC'
In [247]:
代码语言:javascript复制df.loc[indexs] = res
In [248]:
代码语言:javascript复制df
Out[248]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | NaN |
绿帝 | 2 | 6 | 12 | NaN |
北丐 | 3 | 7 | 13 | NaN |
东邪 | 4 | 8 | 14 | NaN |
中李野 | 5 | 9 | 15 | NaN |
李晶 | 东北 | 男 | 1045 | ABC |
In [252]:
代码语言:javascript复制#删除
代码语言:javascript复制a = df.iloc[0:4]
代码语言:javascript复制b = df.iloc[-1]
代码语言:javascript复制a.loc[b.name] = b.values
In [264]:
代码语言:javascript复制
代码语言:javascript复制#drop()
代码语言:javascript复制#labels=None
代码语言:javascript复制#axis=0 删除行 1 删除列
代码语言:javascript复制#inplace=False 默认不对原对象产生影响
代码语言:javascript复制df.drop(labels=['中李野','李晶'],axis=0,inplace=True)
In [265]:
代码语言:javascript复制df
Out[265]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | NaN |
绿帝 | 2 | 6 | 12 | NaN |
北丐 | 3 | 7 | 13 | NaN |
东邪 | 4 | 8 | 14 | NaN |
空值检测
MySQL 中是 null python 中是 None Data 中是 NaN Not a Number 是一个float
- isnull() 检查元素为空
- notnull() 不为空
- dropna() 删除包含NaN的行或者列
- fillna() 填充值
In [270]:
代码语言:javascript复制type(np.NaN)
Out[270]:
代码语言:javascript复制float
In [275]:
代码语言:javascript复制#NaN和任何的数值做计算,返回的都是NaN
代码语言:javascript复制np.NaN - np.array([1,2,3,4,5])
Out[275]:
代码语言:javascript复制array([nan, nan, nan, nan, nan])
In [291]:
代码语言:javascript复制#dataframe在循环的时候,默认是循环列
代码语言:javascript复制for c in df:
代码语言:javascript复制 display(df[c].isnull())
. . .
In [294]:
代码语言:javascript复制#按行 for i in df.index:
代码语言:javascript复制# display(df.loc[i])
代码语言:javascript复制#按列
代码语言:javascript复制for i in df.columns:
代码语言:javascript复制 print(df.loc[:,i])
. . .
In [300]:
代码语言:javascript复制#dropna()
代码语言:javascript复制#到底删行还是列
代码语言:javascript复制#一行代表一个样本的信息
代码语言:javascript复制#一列是代表所有样本的信息
代码语言:javascript复制#如果行当中的空数据太多,那就删行
代码语言:javascript复制df.dropna(axis=0, how='any')
Out[300]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | 1 |
东邪 | 4 | 8 | 14 | 1 |
In [312]:
代码语言:javascript复制#fillna()
代码语言:javascript复制#method=方式, axis=轴
代码语言:javascript复制#{'backfill', 'bfill', 'pad', 'ffill', None}
代码语言:javascript复制df.fillna(method='ffill',axis=1)
Out[312]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | 1 |
绿帝 | 2 | 6 | 12 | 12 |
北丐 | 3 | 7 | 13 | 13 |
东邪 | 4 | 8 | 14 | 1 |
In [325]:
代码语言:javascript复制#取均值
代码语言:javascript复制df['D'].fillna(value=df['D'].mean(),inplace=True)
In [326]:
代码语言:javascript复制df
Out[326]:
A | B | C | D | |
---|---|---|---|---|
西毒 | 1 | 5 | 11 | 1.0 |
绿帝 | 2 | 6 | 12 | 1.0 |
北丐 | 3 | 7 | 13 | 1.0 |
东邪 | 4 | 8 | 14 | 1.0 |
In [331]:
代码语言:javascript复制df.iloc[1].median()
Out[331]:
代码语言:javascript复制4.0
使用pandas连接数据库
In [349]:
代码语言:javascript复制import pymysql
代码语言:javascript复制
代码语言:javascript复制conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='123456',db='python')
代码语言:javascript复制cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
代码语言:javascript复制cursor.execute('select * from userinfo1')
代码语言:javascript复制res = cursor.fetchall()
代码语言:javascript复制cursor.close()
代码语言:javascript复制conn.close()
In [336]:
代码语言:javascript复制pd.DataFrame(data=res)
Out[336]:
id | name | pwd | |
---|---|---|---|
0 | 1 | 张三 | 123456 |
1 | 2 | 赵四 | 123456 |
2 | 3 | 王五 | 123456 |
3 | 4 | 赵六 | 123456 |
4 | 5 | 鬼脚七 | 123456 |
sqlalchemy
In [13]:
代码语言:javascript复制from sqlalchemy import create_engine
In [14]:
代码语言:javascript复制db_info = dict(
代码语言:javascript复制 user='root',
代码语言:javascript复制 password='123456',
代码语言:javascript复制 host='192.168.1.215',
代码语言:javascript复制 port=3306,
代码语言:javascript复制 database='a',
代码语言:javascript复制 charset='utf8',
代码语言:javascript复制)
In [17]:
代码语言:javascript复制import pymysql
代码语言:javascript复制engine=create_engine('mysql pymysql://{user}:{password}@{host}:{port}/{database}?charset={charset}'.format(**db_info))
In [21]:
代码语言:javascript复制da = pd.read_sql('abc',engine)
把表中的数据保存成文件
In [ ]:
代码语言:javascript复制da.to_csv(path_or_buf='userinfo1.csv')
把文件当中的数据保存到数据库中
In [ ]:
代码语言:javascript复制AAPL.to_sql('aapl2',engine,index=False)