起步
pandas是一种Python数据分析的利器,是一个开源的数据分析包,最初是应用于金融数据分析工具而开发出来的,因此pandas为时间序列分析提供了很好的支持。pandas是PyData项目的一部分。
安装与导入
安装方式
Python的Anaconda发行版,已经安装好pandas库,不需要另外安装
使用Anaconda界面安装,选择对应的pandas进行勾选安装即可
使用Anaconda命令安装:conda install pandas
使用PyPi安装命令安装:pip install pandas
导入:
from pandas import Series, DataFrame
import pandas as pd
Pandas的数据类型
Pandas基于两种数据类型: series 与 dataframe 。
**Series:**一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
**DataFrame:**一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
Series
一个series是一个一维的数据类型,其中每一个元素都有一个标签。类似于Numpy中元素带标签的数组。其中,标签可以是数字或者字符串。
- series属性
编号 | 属性或方法 | 描述 |
1 | axes | 返回行轴标签列表。 |
2 | dtype | 返回对象的数据类型(dtype)。 |
3 | empty | 如果系列为空,则返回True。 |
4 | ndim | 返回底层数据的维数,默认定义:1。 |
5 | size | 返回基础数据中的元素数。 |
6 | values | 将系列作为ndarray返回。 |
7 | head() | 返回前n行。 |
8 | tail() | 返回最后n行。 |
- pandas.Series( data, index, dtype, copy)
编号 | 参数 | 描述 |
1 | data | 数据采取各种形式,如:ndarray,list,constants |
2 | index | 索引值必须是唯一的和散列的,与数据的长度相同。 默认np.arange(n)如果没有索引被传递。 |
3 | dtype | dtype用于数据类型。如果没有,将推断数据类型 |
4 | copy | 复制数据,默认为false。 |
创建series方式
通过一维数组方式创建
import numpy as np
import pandas as pd
s = pd.Series([1, 2, 5, np.nan, 6, 8])
print(s)
输出:
0 1.0
1 2.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
从ndarray创建一个系列
data = np.array(['a','b','c','d'])
ser02 = pd.Series(data)
ser02
#指定索引
data = np.array(['a','b','c','d'])
# ser02 = pd.Series(data,index=[100,101,102,103])
ser02 = pd.Series(data,index=['name','age','sex','address'])
ser02
输出:
0 a
1 b
2 c
3 d
dtype: object
name a
age b
sex c
address d
dtype: object
从字典创建一个系列
字典(dict)可以作为输入传递,如果没有指定索引,则按排序顺序取得字典键以构造索引。 如果传递了索引,索引中与标签对应的数据中的值将被拉出。
data = {'a':1,'b':2,'c':3}
ser03 = pd.Series(data)
ser03
#指定索引
data = {'a':1,'b':2,'c':3}
ser03 = pd.Series(data,index = ['a','b','c','d'])
ser03
#标量创建
ser04 = pd.Series(5,index = [0,1,2,3])
ser04
输出:
a 1
b 2
c 3
dtype: int64
a 1.0
b 2.0
c 3.0
d NaN
dtype: float64
0 5
1 5
2 5
3 5
dtype: int64
Series值的获取
Series值的获取主要有两种方式:
- 通过方括号+索引的方式读取对应索引的数据,有可能返回多条数据
- 通过方括号+下标值的方式读取对应下标值的数据,下标值的取值范围为:[0,len(Series.values));另外下标值也可以是负数,表示从右往左获取数据
Series获取多个值的方式类似NumPy中的ndarray的切片操作,通过方括号+下标值/索引值+冒号(:)的形式来截取series对象中的一部分数
#引入模块
import pandas as pd
import numpy as np
#检索第一个元素。
ser05 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(ser05[1])
print(ser05['a'])
print(ser05['d'])
输出:
2
1
4
#检索系列中的前三个元素
ser05 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#通过索引来获取数据
print(ser05[:3])
print(ser05[::2])
print(ser05[4:2:-1])
#通过标签(下标值)来获取数据
print(ser05['b':'d'])
ser05['a':'d':2]
ser05['e':'c':-1]
ser05[['a','b']]
输出:
a 1
b 2
c 3
dtype: int64
a 1
c 3
e 5
dtype: int64
e 5
d 4
dtype: int64
b 2
c 3
d 4
dtype: int64
a 1
b 2
dtype: int64
Series的运算
#引入模块
import pandas as pd
import numpy as np
series = pd.Series({'a':941,'b':431,'c':9327})
series
#输出大于500的值
series[series>500]
#计算加
series+10
#计算减
series-100
#计算乘
series*10
#两个系列相加
ser01 = pd.Series([1,2,3])
ser02 = pd.Series([4,5,6])
ser01+ser02
#)计算各个元素的指数e的x次方 e 约等于 2.71828
np.exp(series)
np.abs(series)
#sign()计算各个元素的正负号: 1 正数,0:零,-1:负数
np.sign(series)
Series自动对齐
当多个series对象之间进行运算的时候,如果不同series之间具有不同的索引值,那么运算会自动对齐不同索引值的数据,如果某个series没有某个索引值,那么最终结果会赋值为NaN。
#引入模块
import pandas as pd
import numpy as np
serA = pd.Series([1,2,3],index = ['a','b','c'])
serB = pd.Series([4,5,6],index = ['b','c','d'])
print('---------serA+serB---------')
print(serA)
serA+serB
输出:
---------serA+serB---------
a 1
b 2
c 3
dtype: int64
a NaN
b 6.0
c 8.0
d NaN
dtype: float64
Series及其索引的name属性
Series对象本身以及索引都具有一个name属性,默认为空,根据需要可以进行赋值操作
DataFrame
一个dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项。
dataFrame属性
编号 | 属性或方法 | 描述 |
1 | T | 转置行和列。 |
2 | axes | 返回一个列,行轴标签和列轴标签作为唯一的成员 |
3 | dtypes | 返回此对象中的数据类型(dtypes)。 |
4 | empty | 如果NDFrame完全为空[无项目],则返回为True; 如果任何轴的长度为0。 |
5 | ndim | 轴/数组维度大小。 |
6 | shape | 返回表示DataFrame的维度的元组。 |
7 | size | NDFrame中的元素数。 |
8 | values | NDFrame的Numpy表示。 |
9 | head() | 返回开头前n行。 |
10 | tail() | 返回最后n行。 |
####dataframe创建方式
pandas中的DataFrame可以使用以下构造函数创建
- pandas.DataFrame( data, index, columns, dtype, copy)
编号 | 参数 | 描述 |
1 | data | 数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame。 |
2 | index | 对于行标签,要用于结果帧的索引是可选缺省值np.arrange(n),如果没有传递索引值。 |
3 | columns | 对于列标签,可选的默认语法是 - np.arange(n)。 这只有在没有索引传递的情况下才是这样。 |
4 | dtype | 每列的数据类型。 |
5 | copy | 如果默认值为False,则此命令(或任何它)用于复制数据。 |
创建一个 DateFrame:
#创建日期索引序列
dates =pd.date_range('20130101', periods=6)
print(type(dates))
#创建Dataframe,其中 index 决定索引序列,columns 决定列名
df =pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df)
输出:
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
A B C D
2013-01-01 0.406575 -1.356139 0.188997 -1.308049
2013-01-02 -0.412154 0.123879 0.907458 0.201024
2013-01-03 0.576566 -1.875753 1.967512 -1.044405
2013-01-04 1.116106 -0.796381 0.432589 0.764339
2013-01-05 -1.851676 0.378964 -0.282481 0.296629
2013-01-06 -1.051984 0.960433 -1.313190 -0.093666
字典创建 DataFrame
df2 =pd.DataFrame({'A' : 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1,index=list(range(4)),dtype='float32'),
'D': np.array([3]*4,dtype='int32'),
'E': pd.Categorical(["test","train","test","train"]),
'F':'foo' })
print(df2)
输出:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
从列表创建DataFrame
data = [1,2,3,4]
df02 = pd.DataFrame(data)
df02
输出:
0
0 1
1 2
2 3
3 4
从列表字典来创建DataFrame
data = {'Name':['Tom','Jack','Steve'],'Age':[19,18,20]}
# df04 = pd.DataFrame(data)
#指定行索引和列索引
df04 = pd.DataFrame(data,index = ['rank1','rank2','rank3'],columns = ['Name','Age','Sex'])
df04
输出:
Name Age Sex
rank1 Tom 19 NaN
rank2 Jack 18 NaN
rank3 Steve 20 NaN
从字典列表创建数据帧DataFrame
data = [{'a':1,'b':2},{'a':1,'b':2,'c':3}]
# df05 = pd.DataFrame(data)
#传递字典列表指定行索引
# df05 = pd.DataFrame(data,index = ['first','second'])
#传递字典列表指定行索引,列索引
df05 = pd.DataFrame(data,index = ['first','second'],columns = ['a','b','c','d'])
df05
输出:
a b c d
first 1 2 NaN NaN
second 1 2 3.0 NaN
从系列的字典来创建DataFrame
data = {
'one':pd.Series([1,2,3],index = ['a','b','c']),
'two':pd.Series([1,2,3,4],index = ['a','b','c','d'])
}
df06 = pd.DataFrame(data)
df06
输出:
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
dataFrame数据操作
列选择
#直接通过列索引来获取某一列的值
data = {
'one':pd.Series([1,2,3],index = ['a','b','c']),
'two':pd.Series([1,2,3,4],index = ['a','b','c','d'])
}
df06 = pd.DataFrame(data)
df06
df06['one']
# df06.one
# df06.ix[:,'one']
# df06.loc[:,'one']
# df06.iloc[:,0]
列添加
data = {
'one':pd.Series([1,2,3],index = ['a','b','c']),
'two':pd.Series([1,2,3,4],index = ['a','b','c','d'])
}
df06 = pd.DataFrame(data)
df06['three'] = pd.Series([10,20,30],index = ['a','b','c'])
df06
列修改
#直接通过列名进行修改
df06['three'] = [7,8,9,10]
df06
列删除
data = {
'one':pd.Series([1,2,3],index = ['a','b','c']),
'two':pd.Series([1,2,3,4],index = ['a','b','c','d']),
'three':pd.Series([10,20,30],index = ['a','b','c'])
}
df06 = pd.DataFrame(data)
#使用del删除列
# del(df06['three'])
#使用pop删除
df06.pop('two')
df06
行选择
data = {
'one':pd.Series([1,2,3],index = ['a','b','c']),
'two':pd.Series([1,2,3,4],index = ['a','b','c','d']),
'three':pd.Series([10,20,30],index = ['a','b','c'])
}
df06 = pd.DataFrame(data)
df06
#可以通过将行标签传递给loc函数或者ix函数来选择行
# df06.loc['a']
df06.loc[:,'two']
# df06.ix['a']
# 按整数位置选择
# 可以通过将整数位置传递给iloc函数来选择行。参考以下示例代码 -
df06.iloc[2]
# 行切片
# 可以使用:运算符选择多行。参考以下示例代码 -
df06[2:4]
行添加
# df06.ix['e'] = [22,33,444]
df06.loc['e'] = [22,33,444]
df06
# 添加加行
# 使用append()函数将新行添加到DataFrame。 此功能将附加行结束。
#创建一行数据
# data2 = pd.DataFrame([{'one':22,'two':33,'three':44}],index = ['e'])
data2 = pd.DataFrame([[22,33,44]],columns = ['one','two','three'],index = ['f'])
# data2
df06 = df06.append(data2)
df06
行删除
df06 = df06.drop('e')
df06