Python--Pandas.2(DataFrame的概念和创建,索引,基本操作)
Posted 我稀饭你
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python--Pandas.2(DataFrame的概念和创建,索引,基本操作)相关的知识,希望对你有一定的参考价值。
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 可以理解是一个二维数组,是一个表格型的数据结构,它包含了有序的列.
print(frame.index) # 取列,标签,索引 print(frame.columns) # 取行
也可以使用Values 取得该DataFrame的值 :
print(frame.values , type(frame.values))
查看该frame的属性,可以看到该frame还是一个数组,接下来看看DataFrame的创建方式
还可以指定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\')
以上是关于Python--Pandas.2(DataFrame的概念和创建,索引,基本操作)的主要内容,如果未能解决你的问题,请参考以下文章
pandas一些基本操作(DataFram和Series)_1
pandas一些基本操作(DataFram和Series)_3
pandas一些基本操作(DataFram和Series)_4
pandas一些基本操作(DataFram和Series)_2