- Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的,Pandas支持时间序列分析,它包含大量库和一些标准数据模型,可高效的操作大型数据集
- Pandas基于numpy实现,常与numpy和matplotlib一同使用
- Pandas有两大核心数据结构:DataFrame(数据框,可以进行行、列索引)、Series(一维数据,为键值对的形式)
Pandas数据结构
- Series:
- 一维数组,与Numpy中的一维array类似
- Series、numpy中的一维array与Python基本的数据结构List相近。区别为:List中的元素可以是不同的数据类型,而array和Series则只允许存储相同的数据类型
- Time-Series:以时间为索引的Series
- DataFrame:带标签且大小可变的二维表格型数据结构,可以将DataFrame理解为Series的容器
- Panel:三维的数组,可以理解为DataFrame的容器
Series
- Series是一种类似于一维数组的对象,它有一维数组(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成
- Series创建函数:
pandas.Series(data,index,dtype,copy)
参数 | 描述 |
---|---|
data | 数据采取各种形式 |
index | 索引值必须是唯一的和散列的,与数据的长度相同 |
dtype | dtype用于数据类型,如果没有,将推断数据类型 |
copy | 复制数据,默认为false |
- Series的创建
使用Python数组创建
import pandas
pandas.Series([11,12],index=['上海','深圳'])
输出:
上海 11
深圳 12
dtype: int64
使用numpy数组创建
import pandas
import numpy
pandas.Series(numpy.arange(3,6))
输出:
0 3
1 4
2 5
dtype: int32
使用Python字典创建
import pandas
pandas.Series({'深圳':11,'上海':12,'重庆':13})
输出:
深圳 11
上海 12
重庆 13
dtype: int64
#与字典不同的是,Series允许索引重复
- 可以通过Series的values和index属性获取其数组表示形式和索引对象
- 与普通numpy数组相比,可以通过索引的方式选取Series中的单个或一组值
- 如果没有为数据指定索引,则自动创建一个0到N-1(N为长度)的整数型索引
import pandas
object=pandas.Series([1,1,2,8])
print(object.values)
print(object.index)
print(object[2])
object[1]=7
print(object[[0,1,2]])
输出:
[1 1 2 8]
RangeIndex(start=0, stop=4, step=1)
2
0 1
1 7
2 2
dtype: int64
- 通常希望所创建的Series带有一个可以对各个数据点进行标记的索引
import pandas
object1=pandas.Series([0,0,2,9],index=['y','y','q','x'])
object1
输出:
y 0
y 0
q 2
x 9
dtype: int64
- Series会在算术运算中自动对齐不同索引的数据
- Series对象本身及其索引都有一个name属性
- Series的索引可以通过赋值的方式就地修改
import pandas
import numpy
obj3=pandas.Series({"Sarawat":numpy.nan,"Tine":30000})
obj3.name='JiaOuTianCheng'
obj3.index.name='Name'
print(obj3)
obj4=pandas.Series([1,2,3,4])
obj4.index=['T','i','n','e']
obj4
输出:
Name
Sarawat NaN
Tine 30000.0
Name: JiaOuTianCheng, dtype: float64
Out[5]:T 1
i 2
n 3
e 4
dtype: int64
DataFrame
- DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)
- DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)
- DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)
DataFrame特点
- 潜在的列是不同的类型
- 大小可变
- 标记轴(行和列)
- 可以对行和列执行算术运算
DataFrame构造函数
import pandas
pandas.DataFrame(data,index,columns,dtype,copy)
参数 | 描述 |
---|---|
data | 数据采取各种形式,如:ndarray、series、map、lists、dict、constant和另一个DataFrame |
index | 对于行标签,如果没有传递索引值,要用于结果帧的索引是可选缺省值numpy.arange(n) |
columns | 对于列标签,在没有索引传递的情况下,可选的默认语法是numpy.arange(n) |
dtype | 每列的数据类型 |
copy | 如果默认值为false,则此命令用于复制数据 |
创建DataFrame
- 创建一个空的DataFrame:函数不指定参数返回空DataFrame
import pandas
df=pandas.DataFrame()
print(df)
输出:
Empty DataFrame
Columns: []
Index: []
- 从列表创建DataFrame
#从单个列表创建DataFrame
import pandas
data=[1,2,3,4]
df=pandas.DataFrame(data)
print(df)
输出:
0
0 1
1 2
2 3
3 4
从嵌套列表创建DataFrame,并指定数据类型
import pandas
data=[['Sarawat',1997],['Tine',1999]]
df=pandas.DataFrame(data,columns=['Name','Years'],dtype=int)
print(df)
输出:
Name Years
0 Sarawat 1997
1 Tine 1999
- 由等长列表或numpy数组组成的字典创建DataFrame
- DataFrame结果会自动加上索引(跟Series一样),且全部会被有序排列
import pandas
data={'Name':['Sarawat','Tine','Ohm'],'Year':[1997,1999,2000]}
df=pandas.DataFrame(data)
df
- 如果指定了列顺序,则DataFrame的列就会按照指定顺序进行排列
- 跟原Series,如果传入的列在数据中找不到,就会产生NAN值
- 通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
- 返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应的设置好了
- 列可以通过赋值的方式进行修改
- 将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配
- 如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有空位都将被填上缺失值
- 为不存在的列赋值会创建一个新列
- 关键字del用于删除列
- 将嵌套字典(字典的字典)传给DataFrame,它会被解释为:外层字典的键作为列,内层键作为行索引
import pandas
pop={'Y':{2000:11,2001:28},'Tine':{1999:6}}
frame=pandas.DataFrame(pop)
frame
- 也可以对上述结果进行转置
- 如果设置了DataFrame的index和columns的name属性,则这些信息会被显示
frame.index.name='yyqx'
frame.columns.name='Win'
frame
- 跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据
- 如果DataFrame各列的数据类型不同,则数组的数据类型就会选用能兼容所有列的数据类型
Pandas常用方法
数据读取与写入
- pandas支持常用的文本格式数据(csv、json、html、剪贴板)、二进制数据(excel、hdf5格式、feather格式、parquet格式、Msgpack、stata、SAS、pkl)、SQL数据库等
- 一般情况下,读取文件的方法以pandas.read_开头,而写入文件的方法以pandas.to_开头
- dtype:数据类型转换
- skiprows:跳过指定的行数
- 自定义索引:可以指定csv文件中的一列来使用index_col指定索引
- 使用names参数指定标题的名称(标题名附加了自定义名称,但文件中的标题还没有被消除。现在,使用header参数来删除它,如果标题不是第一行,则将行号传递给标题这将跳过前面的一行)
Pandas的读取和写入数据
描述性统计方法- Pandas提供了几个统计和描述性方法,方便我们从宏观的角度去了解数据集,例如count()用于统计非空数据的数量
- 除了统计类的方法,Pandas还提供了很多计算类的方法。
函数 | 描述 |
---|---|
count() | 非空观测数量 |
sum() | 所有值之和 |
mean() | 所有值的平均值 |
median | 所有值的中位数 |
mode() | 值的模值 |
std() | 值的标准偏差 |
min() | 所有值的最小值 |
max() | 所有值的最大值 |
abs() | 绝对值 |
prod() | 数组元素的乘积 |
cumsum() | 累计总和 |
cumprod() | 累计乘积 |
import pandas
d={'Name':pandas.Series(['Sarawat','Tine','Ohm','Fluke','Bright','Win']),'Age':pandas.Series([1997,1999,1995,1996,1997,1999]),'Year':pandas.Series([23,21,25,24,23,21])}
df=pandas.DataFrame(d)
print(df,'\n')
print(df.sum(),'\n')#列求和,默认axis=0
print(df.sum(1),'\n')#行求和,axis=0
print(df.mean(),'\n')#求均值
print(df.std(),'\n')#标准差
print(df.describe(include=['number']))#统计信息摘要
- 要遍历数据帧(DataFrame)中的行,可以使用以下函数:
iteritems():迭代(key、value)对。将每个列作为名称,将索引和值作为键和列值迭代为Series对象
iterrows():将行迭代为(索引、系列)对。iterrows()返回迭代器,产生每个索引值以及包含每行数据的序列
itertuples():以namedtuples的形式迭代行。该方法将为DataFrame中的每一行返回一个产生一个命名元组的迭代器。元组的第一个元素将是行的相应索引值,而剩余的值是行值
排序
- 按索引排序:使用sort_index()方法,通过传递axis参数和排序顺序,可以对DataFrame进行排序,默认情况下,按照升序对行标签进行排序
- 按数值排序:sort_values()是按值排序的方法。它接受一个by参数,它将使用要与其排序值的DataFrame的列名称
- 排序顺序:通过将布尔值传递给升序参数ascending,可以控制排序顺序
- 按行或列排序:通过设置axis参数为0或1,为0时逐行排序,为1时逐列排序,默认为0
import pandas
import numpy
unsorted_df=pandas.DataFrame(numpy.random.rand(10,2),index=[1,2,3,4,5,6,7,8,9,0],columns=['A','B'])
print(unsorted_df,'\n')
sorted_df=unsorted_df.sort_index(ascending=True)#按索引排序
print(sorted_df,'\n')
sorted_df=unsorted_df.sort_values(by='B')#按B列的值进行排序
print(sorted_df,'\n')
缺失值处理
- 缺失值主要是指数据丢失的现象,也就是数据集中的某一块数据不存在
- 除了原始数据集就已经存在缺失值以外,当我们用到索引对齐(reindex(),选择等)方式时,也容易人为导致缺失值的产生
- 缺失值处理包括:缺失值标记、缺失值填充、缺失值插值
- Pandas为了更方便的检测缺失值,将不同类型数据的缺失均采用NaN标记,这里的NaN代表Not a Number,它仅仅是作为一个标记
- Pandas中用于标记缺失值主要用到两个方法,分别是:isnull()和notnull(),顾名思义就是[是缺失值]和[不是缺失值]。默认会返回布尔值用于判断
- Pandas提供了各种方法来清楚缺失的值,fillna()函数可以通过几种方法用非空数据“填充”NaN值
- 用标量值替换NaN
- 向前填充:pad\fill
- 向后填充:bfill\backfill
print(df.fillna(0))
print(df.fillna(method='pad'))
print(df.fillna(method='backfill'))
- 丢弃缺少的值:如果只想排除缺少的值,则使用dropna函数和axis参数。默认情况下,axis=0,如果行内的任何值是NaN,那么整个行被删除
- 丢弃含NaN值的行
- 丢弃含NaN值的列
print(df.dropna())
print(df.dropna(axis=1))