pandas(一)

基于Numpy的一种工具,纳入了大量库和一些标准的数据模型,提供了高有效地操作大型数据集所需地工具

series对象

series : 一维数组(列放置)

常用操作

import pandas as pd
from pandas import Series,DateFrame

1. 创建

# Series 能为数据自定义标签,即索引。同时支持位置和标签两种方式获取数据。

sel = Series(data = [1,2,3,4], index = list('abcd'))

# 获取内容
sel.values

# 获取索引
sel.index

# 获取索引和值对
list(sel.iteritems())

# 将字典转换为series。key变为标签索引,值为值
dict = {"red":100,"black":400,"green":300,"pink":900}
se1 = Series(dict)

2. 获取数据

# 获取数据
sel[1]
sel['b']

# 获取不连续的数据必须传入列表
sel[[1,3]]

# series对象可以使用切片获取数据
sel[1:3]      # 位置切片,左闭右开
sel['b':'d']  #标签切片,左闭右闭

3. 数据修改

# 重新指定索引
sel.index = list('dcba')

# 重新索引值排序
sel.reindex(index = ['b','a','c','d','e'])   #值按照最新的索引将索引值对重新排列,没有值得标签索引对应值为NaN
sel.reindex(index = ['b','a','c','d','e'],fill_value =10)  #或者补充指定的值

# Drop()丢弃指定轴上的项
sel.drop([2,3])

# 修改指定数据
sel[1]  =100


4. 算数运算
# 对series的算术运算都是基于index进行的,结果以浮点数的形式储存,以免丢失精度。
# 如果Pandas在两个series里找不到相同的标签index,对应的位置就返回一个空值NaN

sel1 +sel2  #+ -  * /


5.  支持Numpy数组运算方法

sel[sel>3]
sel*2
np.square(sel)

DtaeFrame对象

二维数据结构,数据以表格的形式存储

三个参数:data(数据),index(行索引),columns(列索引)

属性 说明
df.shape 获取行数和列数
df.index.tolist() 获取行索引
df.columns.tolist() 获取列索引
df.dtypes 获取数据的类型
df.ndim 获取数据的维度
df.info() 展示df的概览
df.head() 显示头几行,默认五行
df.tail() 显示后几行,默认五行
df.values 获取相应的值

1. 创建
# 使用二维数组
df1 = DataFrame(np.random.randint(0,10,(4,4),index = [1,2,3,4],columns = ['a','b','c','d']))

# 使用字典
dict={
    'a':['A','B','C','D'],
    'b':[1,2,3,4],
    'c':[2,4,5,7]
}
df2 = pd.DataFrame(dict,index=[1,2,3,4])   # key变为列索引

# 使用from_dict
df3 = pd.DataFrame.from_dict(dict)


# 索引相同的情况下,相同索引的值会相对应,缺少的值会添加NaN
dict1={
    'a':pd.Series(['A','B','C','D','E'],index =[1,2,3,4,5]) ,
    'b':pd.Seres([1,2,3,4],index =[1,2,3,5]) ,
    'c':pd.Series([2,4,5,7],index =[2,3,4,5]) 
}
df4 = pd.dataframe(dict4)
# dataframe转换成字典

dict = df4.to_dict()


2. 获取行列的值

# 获取列
df['a']   # 只获取一列,所以返回的是一个series
df[['a','b']]  # 获取多列,返回的是一个dataframe 类型

# 获取行
df[0:1]   # 获取一行
df[1:3]  # 获取多行

# 获取行列
df[0:2][['a','b']]   #不能直接进行多行多列的选择,可以先取出某些行再取列

# 通过标签索引获取数据loc
df.loc['1','a']     #通过标签索引获取某一行某一列的数据
df.loc['1',:]        # 一行所有的列
df.loc['1',['a','b']]   # 一行的多列
df.loc[['1','3'],['a','b']]  #间隔的多行多列
df.loc[['1':'3'],['a','b']]  #联系的多行间隔的多列

# 通过位置索引获取数据iloc

df.iloc[1]   # 取一行
df.iloc[0:2]  # 取连续的多行
df.iloc[[0,2],:]  # 取间断的多行
df.iloc[:,1]     # 取一列
df.iloc[1,0]      # 取某一个值

# 修改值
df.iloc[0,0] = 'f'

# 对数据进行排序
df = df.sort_values(by = 'b',ascending =False)

3. 修改行索引,列索引

# 暴力修改
df.index = ['1','2','3']

# rename,inplace
def test_map(x):
    return x+'a'  #x是原有的行列值
# inplace:布尔值,默认为false,指定是否赶回新的dataframe。如果为true,则在原df上修改
df_new = df.rename(index = test_map,columns = test_map,inplace =False)

#修改某个或某些索引
df5 = df.rename(index = {'1':'q'},columns = 'a':'aa')


# 列转化为行索引
df6 = df.set_index('a',drop =False)  #指定一列为索引,drop指定是否保留作为索引的列,drop默认为True
df6.index.name =None   #将索引的名字设为none

# 将行转化为列索引
df7 = df.set_axis(df.iloc[0],axis=1,inplace =False)    #轴的大小和numpy一样
df7.columns.name = None

4. 操作

#增加列数据
df.['e'] = [8,8,9,0]    #不能是重复的列名


# 插入一列
df.insert(iloc,column,value)   # iloc要插入的位置,column:列名,value:值

# 修改行数据
row= [1,2,3,4]
df.iloc[1] = row

# 增加行数据
new = pd.DataFrame({'a':0,'b':0,'c':0,'d':0},index =[0])  #创建新的一个dataframe,用来增加行
df8 = df.append(new,ignore_index =True)


# 删除数据
df9 = df.drop(['a'],axis =1,inplace =True)   #删除列
df9 = df.drop([0,1],axis =0,inplace =Flase)  #删除行
# lables: 要删除数据的标签,axis:0表示删除行,列表示删除列。inplace:是否在原有的df中执行操作

数据处理

数据清洗

  • 过滤缺失值:dropna()
  • 填充缺失值:fillna()
  • 判断重复值:duplicated()
  • 移除重复值:drop_duplicates()
from numpy import nan as NaN

1. 查看缺失值
se = pd.series([1,NaN,3,NaN,5])

se.dropna()   # 删除缺失值
se.notnumll()  # 不为空的为True
se.isnull()   # 为空的为True
se[se.notnull()]   #过滤



2. 删除缺失值

df = pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[1,2,NaN]])

df.dropna()   #删除所有含有nan的行
df.dropna(how = 'all')  #删除全为NaN的行,默认为how = 'any',只要行有NaN就删除

df.dropna(axis = 1,how = 'all')  #传入axis = 1,删除列

df.dropna(thresh = n ) #保留至少有n个非NaN数据的行



3. 填充缺失值
df.fillna(0,inplace)   #用常数填充nan,inplace是否直接在原df上修改,默认为Flase

df.fillna({0:10,1:20,3:30})  # 通过字典填充不同的常数。字典的key代表的是列,value是填充的常数

df.fillna(df.mean())   #填充平均值,对应的列的平均值

df.iloc[:,1].fillna(3,inplace =True)  #只填充一列


df.fillna(method = 'ffill',limit =1,axis = 1)
# ffill:用前面的值来填充; bfill:用后面的值填充。前后默认按照0轴方向上下,当前后无值的时候,不填写。
# 传入limit= ,现值填充的行数
# 传入axis= ,修改填充的方向。axis =1 ,左右填充


4. 移除重复值
df1 = pd.dataframe({'A':[1,1,1,2,3,1],'B':list('aabbbca')})

df1.duplicated()  #判断重复,bool

df1.drop_duplicates()    #去除全部重复行
df1.drop_duplictees(['A'])    # 指定列去重复行
df1.drop_duplictees(['A'],keep ='last')   #保留重复行中的最后一行,默认保留第一行
df1.drop_duplictees(['A','B'],inplace = True)    #去重同时改变原有df

posted @ 2021-10-10 15:56  突然跳舞的咸鱼  阅读(64)  评论(0)    收藏  举报