Pandas数据操作

  • 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索引值必须是唯一的和散列的,与数据的长度相同
dtypedtype用于数据类型,如果没有,将推断数据类型
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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值