码迷,mamicode.com
首页 > 编程语言 > 详细

Python--Pandas.2(DataFrame的概念和创建,索引,基本操作)

时间:2019-11-01 16:18:58      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:ima   多重   style   操作   添加   列表创建   div   com   info   

DataFrame

DataFrame 概念和创建 :

先来看一个例子 :
这是一个由列表组成的字典

 

import numpy as np
import pandas as pd
  
data = {name:[Jack,Tom,Mary],age:[18,19,21],gender:[m,m,w]}
frame = pd.DataFrame(data)
print(frame)

 

技术图片

 

 可以看到 DataFrame 可以理解是一个二维数组,是一个表格型的数据结构,它包含了有序的列.

其列的值 ,它可以是 字符串 数值 或者是 布尔值等. 从行和列看,DataFrame是一个带有标签的二维数组
 
如何取行和列呢?    是用index 和 columns属性可以拿到,如下 :
print(frame.index)  # 取列,标签,索引
print(frame.columns)  # 取行

技术图片

 

 

 也可以使用Values 取得该DataFrame的值 :

print(frame.values , type(frame.values))
技术图片

 

 查看该frame的属性,可以看到该frame还是一个数组,接下来看看DataFrame的创建方式

 


方法一 : 是由数组或者list组成的字典. 每一个键值对,就是一列,且长度需要一致.如图

 

技术图片

 

 

 还可以指定DataFrame的,使用cloumns属性和 index 属性  list类型参数,(如果设置的该列不存在,就用NaN填充) :

frame = pd.DataFrame(data,index=[Jack,Tom,Mary],columns=[age,name,gender,height])

技术图片

 

 

 需要注意的是 指定index 重新定义索引,格式是list ,长度需要一致.否则报错!

 

方法二 : 由 Series组成的字典 :

data1 = {one:pd.Series(np.random.rand(2)),two:pd.Series(np.random.rand(3))}  #没有设置index的Series
data2 = {one:pd.Series(np.random.rand(2),index=[a,b]),two:pd.Series(np.random.rand(3),index=[a,b,c])}  #设置了indes9Series
print (data2)
df1 = pd.DataFrame (data1)
df2 = pd.DataFrame (data2)

技术图片

 

 

 与上面的方法一相比,Series 可以长度不一样,对于没有的值,DataFrame会用NaN填充.

由Series 组成的字典, 创建DataFrame时, columns为字典的key,index为Series 的标签,就是索引.如果Series没有指定标签,那就默认用数字标签.

 

方法三  : 通过 二维数组 直接创建

arr = pd.DataFrame(np.random.rand(9).reshape(3,3))

技术图片

 

 

 可以看到,由于没设置 行和列 , 所以默认用数字标签. 这样不美观,不便于编码,所以我们可以手动添加columns和index 

arr1 = pd.DataFrame(np.random.rand(9).reshape(3,3),index=[a,b,c],columns=[one,two,three])

技术图片

 

 

 通过 二维数组 直接创建DataFrame,得到一个形状的结果数据.如果不指定index 和 columns,两者均返回默认的数字格式.

 ?? 尝试一下index 或columns 长度不等于已有数据的情况 ??

arr1 = pd.DataFrame(np.random.rand(9).reshape(3,3),index=[a,b,c,d],columns=[one,two,three])  #index中的d

技术图片

 

 

 报错了, 所以index 和columns的长度必须与原数据保持一致!

 

 方法四 : 由 字典组成的列表

data = [{one:1,two:2},{one:5,two:10,three:20}]
arr= pd.DataFrame(data)

技术图片

 

 

 由 字典组成的列表创建DataFrame, columns为字典的key ,index 不做指定则默认为数据标签.

如果设置index 那么标签/索引就是 指定的 : 

arr= pd.DataFrame(data,index=[a,b])

技术图片

 

 

 如果只设置了行 那么 就只创建指定的行

arr= pd.DataFrame(data,columns=[one,two])

技术图片

 

 

# columns 和 index 参数分别重新指定相应列 及行 标签  以上#

 

方法五 : 由 字典组成的字典 

data = {
    Jack:{
        math:90,english:89,art:78
    },
    Marry:{
        math:82,english:95,art:92
    },
    Tom:{
        math:78,english:67
    }
}
df = pd.DataFrame(data)

技术图片

 

 

 # 可以看到 由字典组成的字典创建DataFrame ,columns为字典的key , index 就是字典的key.

另外 : columns参数可以增加和减少现有的列 ,如果出现新的列,会用NaN值进行填充 ,如下 : 

df = pd.DataFrame(data , columns=[Jack,Marry,Tom])

技术图片

 

 

另外 Index正在这里可之前不同, 不能改变原有的 index ,如果指定为新的标签 ,值就会变成NaN ,因为它匹配不到指定的标签(非常重要) ,如图 : 

df = pd.DataFrame(data , index=[a,b,c])

技术图片

 

 

 ### 以上就是DataFrame的几种创建方法 . . . . . .

 

 


DataFrame 索引 :

1. 如何选择 行 和 列  : 

df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=[one,two,three],columns=list(abcd))

 

技术图片

 

 选择一列 或者 多列 :

df[a]  #单列 
df[[a,c]] #多列

技术图片

DataFrame是一个包含多个Series的数组, 所以 返回的单列 是一个 Series . 返回多列 则是一个DataFrame.

技术图片

 

 

单独选列 整数参数可以选择行,但是不能单独选 必须以冒号来选 ,利用切片的方式 !

行 - loc : 按index 选择行

df.loc[two]

技术图片

 

 

 当我们指定index 只能使用索引标签, 未指定index 才能使用数字索引 .  返回的单行  和 多行,同上,Series 和DataFrame类型

 如果选择 不存在 的行 ,Pycharm 会报错 , 而Jupyter 则会用NaN填充!

标签不同 切片方式也不相同 :

df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=[one,two,three],columns=list(abcd))
df1 = pd.DataFrame(np.random.rand(12).reshape(3,4),columns=list(abcd))
print(df.loc[two:three])
print(df1.loc[1:2])

技术图片

 

 

 DataFrame 使用整数做索引,index是可变的,所以整数成了标签,string 而不是数字. 标签切片 ,闭区间

 DataFrame.loc[ label ] 主要是针对 行 索引 ,同时指出指定index 以及默认index 

 

DataFrame .iloc[ ]   按照参数位置(从0到length-1) 选择行,类似于 list 的索引,顺序是DataFrame的整数位置,从0开始

df.iloc[0]  #取一行
df.iloc[[0,1]] #选择多行
df.iloc[[1,0]] #位置变换去行

技术图片

 

 

 运行之后,从结果可以看出,正常索引没有问题,选择多行, 索引顺序可变,python会自动去配对相应的行索引. 同时索引时,不能超出索引的范围

如果忘了 函数的使用 可以用全局函数 help(参)  接口来查看相应的使用方式及详细说明

 

布尔型索引 -- 原理上 和Series 原理相同,看代码 : 

df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=list(one,two,three),columns=list(a,b,c,d)) * 100

技术图片

 

 

b1 = df <50 # 返回一个和df形状相同的布尔型的dataframe
df[b1]  #返回一个dataframe,所有数据,True返回原数据,False 返回NaN

技术图片

 

 还可以对单列进行判断 : 

b2 = df[a]>30
print(df[a][b2])

技术图片

 

 # 单列就是一个Series ,索引时,保留判断为True的列数据和行. 范湖的是一个Series .

还可以多行,多列判断 :

b3 = df[[a,b]]>30
print(df[b3])

技术图片

 

 多行多列 返回形状相同的dataframe ,为True的返回原数据,False返回NaN 值.

 

多重索引  同时索引行和列

#多重索引的几种方式
df[a].loc[[one,three]]  #从A列索引one ,three 两行数据
df[[b,c,d]].iloc[::2]  # 从b,c,d3列索引,每隔2个索引一条
df[df[a]<50].iloc[0]  #索引A列小于50的第一个值

技术图片

 

 索引的方式多种多样 , 多尝试多探索. 索引的基本方式就是这样了


DataFrame 基本操作 :

 

df = DataFrame(np.random.rand(10000).reshape(100,100))

 前 head()  尾 tail() :

df.head(2)   # 查看前 2行

df.tail(3)   #查看尾 3行  默认查看5行

技术图片

 

 

 数据转置

dfs = DataFrame(np.random.rand(4).reshape(2,2))
dfs dfs.T

技术图片

 

 

 添加和修改

添加 index 和 添加columns :

dfs.index =[one,two]
dfs.columns=list(ab)

技术图片

 

 

 添加 指定 值 :

dfs[c] =88

技术图片

 

 

 修改 列多列 :

dfs[c] =20
dfs[[a,b]] = 33

技术图片

 

 

 添加 行  :

dfs.loc[c] =6  #添加行 c 并指定值为6

技术图片

 

 

 ① 删除 :

del dfs[a]

技术图片

 

 

 

  列删除方法  drop  :

dfs.drop(‘one‘)  # 按索引删除  数字,字符串 类型  默认返回删除后的DataFrame  不修改原数据

技术图片

 

 

 drop 有个默认参数 ‘axis‘ , 默认为0, 删除行. 设置为1 删除列

dfs.drop(b,axis=1)

技术图片

 

 

 # drop 默认返回一个数据类型, 设置inplace为True时,不返回值,会修改原数据 

dfs.drop(b,axis=1,inplace=True)
print(dfs)

技术图片

 

 

 

对齐 将两个DataFrame相加时

df1 = DataFrame(np.arange(9).reshape(3,3),columns=list(abc))
df2 = DataFrame(np.arange(4).reshape(2,2),columns=list(ab))

print(df1+df2)

技术图片

 

 

 DataFrame相加时  按照行和列 对齐相加,如果不存在的行和列 则和NaN相加 ,NaN和任何值相加都为NaN

 

排序功能

对行 或者 列 进行排序 :

df = DataFrame(np.random.randint(16,size=[4,4]),columns=list(‘abcd‘))
print(df)  #原数据

技术图片

 

 

 按值 排序 :

df.sort_values(d) 

技术图片

 

 

 

  ?? : 按照列标签等于指定 列 的值进行排序 , 默认从小到大, 参数 ascending 默认为True 升序,False就降序

  ?? :默认 axis=0 用列的值对行进行排序,设置 1 则对行的值对列进行排序。所以第一个参数需要传入列索引

 

df.sort_values(2,axis=1)

技术图片

 

 

 

索引排序 

df.index= [5,3,1,2]
df.sort_index() 

技术图片

 

 

 ?? :默认按索引进行升序,ascending=False 降序 ,如果要对列排序 将axis参数设置为 1 即可。(行首和列首只有一行,所以不需要填索引)

 ?? :sort_values , sort_index   都有一个 inplace  的参数,作用与上面的API一致(设置为True 时,修改原数据不返回对象,否则返回新的对象.)

 

Python--Pandas.2(DataFrame的概念和创建,索引,基本操作)

标签:ima   多重   style   操作   添加   列表创建   div   com   info   

原文地址:https://www.cnblogs.com/luowei93/p/11768920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!