一、Series与python字典对比
Series兼并了数组和字典的功能,既可以看作是一种特殊的字典,又可以看成是通用的Numpy数组。既可以支持数组的切片操作等,还可以运用字典获取values的方法,举例:
dic={1:'beijing',2:'xiaan',3:'tianjing',4:'japan','five':'American'}
nums=[1,2,3,4,'five']
series=pd.Series(dic,index=nums)
#字典的取值方法
print('dic:',dic['five'])
print('series:',series['five'])
#数组切片
#注意结果是不包含区间左端的
print("切片结果:",series[1:3])
Series的index和字典一样都是无法更改的
- 两种创建Series的方法
dic={1:'beijing',2:'xiaan',3:'tianjing',4:'japan'}
nums=[1,2,3]
series=pd.Series(dic,index=nums)
series1=pd.Series(['a','b','c'],index=[1,2,3])
print("values:"," ".join(series.values))
print(series1)
values: beijing xiaan tianjing
1 a
2 b
3 c
dtype: object
- Series数据提取
Series当作一维数组看时,花哨的索引数据选择法
dic=1:'beijing',2:'xiaan',3:'tianjing',4:'japan','five':'American','six':'Tailand','seven':'Korea'}
nums=[1,2,3,4,'five','six','seven']
series=pd.Series(dic,index=nums)
#混合索引 数组取值
print("混合索引 数组取值:",series[[2,'five']])
#混合索引 数组切片 报错 不能不同类型的索引类型混合切片
# print("切片结果:",series[2:'old'])
混合索引 数组取值: 2 xiaan
five American
dtype: object
用隐式索引和显示索引两种切片
#数组切片--隐式索引
#注意结果是不包含区间左端的
print("切片结果:",series[1:3])
#数组切片 --显式索引
print("切片结果2:",series['five':'seven'])
切片结果: 2 xiaan
3 tianjing
dtype: object
切片结果2: five American
six Tailand
seven Korea
- 两种索引器
import pandas as pd
#索引器
data = pd.Series({1:'Zames',2:'Jack',3:'Marry',4:'Jess'})
#取值和切片都是显式的
print(data.loc[1])
print(data.loc[1:3])
#取值和切片都是隐式的
print(data.iloc[1])
print(data.iloc[1:3])
这里显式和隐式的区分在于:Series打印出来它的列索引所显示的就是显式定义的索引,而数组比如[1,2,3,4,5,6]索引相当于【0,1,2,3,4,5】,相对来说就是隐式定义的索引了。loc针对显式的索引,即索引的数字是在Series对象中显式定义的。
二、DataFrame与其他数据类型对比
DataFrame可以看作同时拥有灵活的行索引和列名的二维数组,也可以看作是有序排列的Series对象,还可以看成一系列键(即列属性) 映射一个Series数据的字典。
举例如下
#建立
import pandas as pd
num_stu=pd.Series([1001,1002,1003,1004,1024,1025],index=['Zames','Jess','Lily','Poter','Lupin','Jupyter'])
nn_stu=pd.Series(['tank','Bear','mum','dad','fri','plat'],index=['Zames','Jess','Lily','Poter','Lupin','Jupyter'])
stu=pd.DataFrame({'num':num_stu,'nn':nn_stu})#括号内用的是字典方法建立DataFrame
stu
DataFrame的索引是无名的,而其他列都可以在创建时设定名称,使用index获取;而其他列使用columns获取,返回的都是Index对象
print(stu.index)
print(stu.columns)
Index(['Zames', 'Jess', 'Lily', 'Poter', 'Lupin', 'Jupyter'], dtype='object')
Index(['num', 'nn'], dtype='object')
- DataFrame的创建
(1)使用元素为字典的列表建立
(2)Series对象:单个Series对象建立
num_stu=pd.Series([1001,1002,1003,1004,1024,1025],index=['Zames','Jess','Lily','Poter','Lupin','Jupyter'])
stu=pd.DataFrame(num_stu,columns=['num'])#单个Series对象建立,直接设定columns name
通过Series为values的字典建立
num_stu=pd.Series([1001,1002,1003,1004,1024,1025],index=['Zames','Jess','Lily','Poter','Lupin','Jupyter'])
nn_stu=pd.Series(['tank','Bear','mum','dad','fri','plat'],index=['Zames','Jess','Lily','Poter','Lupin','Jupyter'])
stu=pd.DataFrame({'num':num_stu,'nn':nn_stu})
#values为Series对象的字典可以用于创建DataFrame
(3)Numpy数组ndarray建立:通过ndarray的二维数组建立,使用DataFrame方法时设立columns name&index name;结构化数组建立
我理解的是,结构化数组就是数组不仅可以按照行索引,列也是有名称可以被索引的。
#建立结构化数组
import numpy as np
teacher_name = ['Zames','Manchester','Li','Jyx']
teacher_age = [30,29,28,27]
teacher_marriage=['F','T','F','T']
teachers=np.zeros(4,dtype={'names':('name','age','marriage'),'formats':('U10','i4','U2')})
teachers['name']=teacher_name#要记得用单引号
teachers['age']=teacher_age
teachers['marriage']=teacher_marriage
#建立DataFrame
pd.DataFrame(teachers)
(4)外源数据创建
read_table(‘文件路径’,(sep=’\t’(表示文件中字段间分隔符为TAB)),(header=None(表示默认没有列名,header=0则表示第0行为列名))
read_csv(‘file_path’,header=None,sep=’\t’)
- DataFrame数据选取
(1)字典式的索引方法获取列数据
#与字典相似的列索引
teacher['name']
0 Zames
1 Manchester
2 Li
3 Jyx
Name: name, dtype: object
用这个方法也可以给DataFrame对象增加新列
teacher['new']=pd.Series([0,1,2,3],index=[0,1,2,3])
teacher[['new','name']]
new name
0 0 Zames
1 1 Manchester
2 2 Li
3 3 Jyx
(2)字典式的方法获取单行数据
teacher.values[0]
array(['Zames', 30, 'F', 0], dtype=object)
对比以上两种不同的索引方法,一种是获取行数据和,一种是获取列数据的
(3)三种索引器
print(teacher)
print(teacher.loc[:"Li",:'age'])#显式 columns_names
print(teacher.iloc[:3,:2])#隐式 数字
print(teacher.ix[:2,:'age'])#混合使用
name age marriage new
0 Zames 30 F 0
1 Manchester 29 T 1
2 Li 28 F 2
3 Jyx 27 T 3
name age
0 Zames 30
1 Manchester 29
2 Li 28
3 Jyx 27
name age
0 Zames 30
1 Manchester 29
2 Li 28
name age
0 Zames 30
1 Manchester 29
2 Li 28