目录
Series基础
创建Series
通过索引获取数据
指定Series的索引值
根据索引值读取数据
使用key/value对象(类似字典)来创建Seires
Dataframe基础
使用列表创建Dataframe
使用ndarrays创建Dataframe
使用字典创建Dataframe
根据列索引提取数据列
添加数据列
对原有数据列进行运算获得新数据列
根据列索引删除数据列
使用del删除指定数据列
使用pop方法删除数据列
使用loc和iloc函数对行索引进行操作
使用loc和iloc获取Dataframe的某一行
使用loc和iloc获取Dataframe的某一列
利用loc,iloc提取指定行、指定列数据
利用loc,iolc提取所有数据
利用loc函数提取特定行
利用切片选取特定行
利用append函数添加数据行
利用drop函数删除数据行
Series基础
Series 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。Series 由索引(index)和列组成,函数语法如下:
pandas.Series( data, index, dtype, name, copy)data:一组数据
index:数据索引标签(行索引),默认从0开始
dtype:数据类型,默认会自己判断
name:Series的名称
copy:拷贝数据,默认为False(不常用)
创建Series
import pandas as pd
data = ['a','b','c']
my_series = pd.Series(data)
my_series
输出:
0 a 1 b 2 c dtype: object
通过索引获取数据
my_series[0]
输出:
'a'
指定Series的索引值
import pandas as pd
data = ['a','b','c']
index = ['first','second','thirdly']
my_series = pd.Series(data,index=index)
my_series
输出:
first a second b thirdly c dtype: object
object为数据类型
根据索引值读取数据
import pandas as pd
data = ['a','b','c']
index = ['first','second','thirdly']
my_series = pd.Series(data,index=index)
my_series['first']
输出:
'a'
使用key/value对象(类似字典)来创建Seires
import pandas as pd
data = {1:'Google',2:'Runoob',3:'Wiki'}
myvar = pd.Series(data)
myvar
输出:
1 Google 2 Runoob 3 Wiki dtype: object
按照这种方法将数据转换成Series时,key转换为每列的索引,value转换成每列的值
按照字典创建Series时,可以只将需要的数据转换成Series
import pandas as pd
data = {1:'Google',2:'Runoob',3:'Wiki'}
myvar = pd.Series(data,index=[2,3])
myvar
输出:
2 Runoob 3 Wiki dtype: object
可以看到只将索引为2,3的数据转换成了Series
Dataframe基础
Dataframe 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。 Dataframe 既有行索引(index)也有列索引(columns),它可以被看做由 Series 组成的字典(共同用一个索引)。
Record为Dataframe的记录,即一行
Dataframe可以由Series合成,而Dataframe的每一列都为Series
创建Dataframe的函数语法如下:
pandas.Dataframe(data,index,columns,dtype,copy)
data:一组数据(ndarray、series、map、lists、dict 等类型)
index:索引值,或者可以称为行标签
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n)
dtype:数据类型,默认会自己判断
copy:拷贝数据,默认为 False(不常用)
使用列表创建Dataframe
import pandas as pd
data = [['Goole',10],
['Runoob',12],
['Wiki',13]]
df = pd.Dataframe(data,columns=['Site','Age'])
df
输出:
data列表中的一个列表元素为一行,columns为每一列的列名
使用dtype参数修改数据类型
import pandas as pd
data = [['Goole',10],
['Runoob',12],
['Wiki',13]]
df = pd.Dataframe(data,columns=['Site','Age'],dtype=float)
df
输出:
可以看到Age列的数据类型变为了float
使用ndarrays创建Dataframe
ndarray为n维数组
import pandas as pd
data = {'Site':['Google','Runoob','Wiki'],'Age':[10,12,13]}
df = pd.Dataframe(data)
df
输出:
可以把data作为一个字典嵌套列表,字典中的key为转换为列名,value列表转换为一列中的数据
使用字典创建Dataframe
import pandas as pd
data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]
df = pd.Dataframe(data)
df
输出:
data为列表嵌套字典,一个字典代表一行数据,字典中的key为列名,value为该列的值
由于data中第一个字典中缺少c键及其对应的值,故在生成的Dataframe中第0行的c列数据为NaN,Not a Number,非数
data中的数据没有float类型的,但是在生成的Dataframe中,第1行的c列数据为20.0,数据类型为float,这是因为NaN在Python中为float类型的,而dtype参数自动检测,将每一列的数据都转换为同一数据类型,所以c列的数据都被转换为了float类型
根据列索引提取数据列
首先创建一个Dataframe
import pandas as pd
data = {'one':pd.Series([1,2,3],index=['a','b','c']),
'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}
df = pd.Dataframe(data)
df
输出:
注意由于第一列的最后一行为NaN,导致该列数据类型全为float
选取two列
df['two']
输出:
a 1 b 2 c 3 d 4 Name: two, dtype: int64
类型为Series
添加数据列
df['three'] = pd.Series([10,20,30],index=['a','b','c'])
df
输出:
对原有数据列进行运算获得新数据列
df['four'] = df['one'] + df['three']
df
输出:
可见,four列中每一行的值都为one列和three列对应行的值的加和
根据列索引删除数据列
import pandas as pd
data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]
df = pd.Dataframe(data)
df
原始数据框:
使用del删除指定数据列
del df['one']
删除后数据框为:
从输出结果可以看出,one列已被删除
使用pop方法删除数据列
语法为:Dataframe.pop(列名)
s = df.pop('one')
输出:
该结果与使用del方法得到的结果一模一样
pop方法与del最大的茶杯是,使用pop方法删除数据列时,pop会将删除的数据列返回,类型为Series
将s输出:
a 1.0 b 2.0 c 3.0 d NaN Name: one, dtype: float64
使用loc和iloc函数对行索引进行操作
loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为"A"的行)
iloc函数:通过行号来取行数据(如取第二行的数据)
首先创建一个Dataframe
import numpy as np
import pandas as pd
df = pd.Dataframe(np.arange(16).reshape(4,4),
index=list('abcd'),columns=list('ABCD'))
df
输出:
首先使用numpy生成元素为0~15的一维数组
np.arange(16)
输出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
接着使用reshape属性将该一维数组转换为4×4的多维数组
np.arange(16).reshape(4,4)
输出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
最后将该多维数组作为数据转换为Dataframe
使用loc和iloc获取Dataframe的某一行
获取Dataframe的第一行数据
df.loc['b']
df.iloc[1]
两种方法都获取到了同样的结果:
A 4 B 5 C 6 D 7 Name: b, dtype: int32
该例中,loc与iloc区别就在于loc通过行索引来获取数据,iloc通过行号来获取数据
使用loc和iloc获取Dataframe的某一列
获取Dataframe的第一列数据
df.loc[:,['A']]
df.iloc[:,[0]]
两种方法都获取到了同样的结果:
在这里使用了切片 : [行开始:行结束:步长,列开始:列结束:步长]
逗号前面时行选择,逗号后面时列选择
loc使用切片时,除了步长,行开始、列开始...都必须为index/columns
iloc使用切片时,除了步长,行开始、列开始...都必须为行号,列号
df.loc['a':'d':2,['A']]
输出:
df.loc[['a'],'A':'D':2]
输出:
当行或列选择中有一个仅为一个index/columns而且不是列表数据时,输出Series
df.loc['a':'d':2,'A']
输出:
a 0 c 8 Name: A, dtype: int32
df.loc['a','A':'D':2]
输出:
A 0 C 2 Name: a, dtype: int32
当行选择和列选择都为一个index/columns时,定位到Dataframe中的一个数据
df.loc['a','A']
输出:
0
使用iloc函数时,情况与loc类似,只是将行选择和列选择中的index/columns改为了行号和列号
df.iloc[0:3:2,[0]]
输出:
df.iloc[[0],0:3:2]
输出:
df.iloc[0:3:2,0]
输出:
a 0 c 8 Name: A, dtype: int32
df.iloc[0,0:3:2]
输出:
A 0 C 2 Name: a, dtype: int32
df.iloc[0,0]
输出:
0
另外还有两种方法获取Dataframe中的指定列
df.A
df['A']
两者输出数据的类型均为Serise
a 0 b 4 c 8 d 12 Name: A, dtype: int32
要想输出的数据为Dataframe类型,要用双中括号
df[['A']]
df[['A','B']]
利用loc,iloc提取指定行、指定列数据
提取index为'a','b',列为'A','B'的数据
df.loc[['a','b'],['A','B']]
逗号前的中括号为index,逗号后的中括号为'A','B'
提取行号为0,1,列号为0,1的数据
df.iloc[[0,1],[0,1]]
逗号前的中括号为行号,逗号后的中括号为列号
两者均输出:
利用loc,iolc提取所有数据
df.loc[::]
df.iloc[::]
两者均输出:
利用loc函数提取特定行
提取A列中数据为0的行
df.loc[df['A']==0]
输出:
结果数据类型为Dataframe
使用loc函数时,可以指定index,将指定的index数据行提取出来
优点是:如果index是人名,数据框为所有人的数据,那么我可以将某个人的多条数据提取出来分析
缺点是:如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理
利用切片选取特定行
选取第2,3行(行数从0开始)的数据
df[2:4]
输出:
切片经典左闭右开,结果数据类型为Dataframe
注意,使用切片时,只允许行切片,不允许列切片
如果将切片像loc,iloc函数一样操作,就会报错,如:
df[2:4,0:2]
报错:
利用append函数添加数据行
创建两个数据框:
import pandas as pd df1 = pd.Dataframe([[1,2],[3,4]],columns=['a','b']) df2 = pd.Dataframe([[5,6],[7,8]],columns=['a','b'])
使用append在df1行末尾追加新的数据行
df1 = df1.append(df2) df1
输出:
注意到index仍为原来各自数据框的index
这里生成的新的数据框,index重复不具有特殊含义,如使用,还需进一步处理
利用drop函数删除数据行
df1 = df1.drop(0)
df1
drop函数中的参数指定删除所有index为该参数的数据行
输出:
由于df1中有两个数据行的index都为0,故删除了两条数据行



