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
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号