一、Series
import pandas as pd
'''pandas数据结构介绍'''
#1、Series
'''Series是一种一维的数组型对象,它包含了一个值序列(类似NumPy中的类型),并且包含了数据标签(也就是index-索引)'''
obj = pd.Series([4, 7, -5, 3])
# print(obj)
'''
0 4
1 7
2 -5
3 3
dtype: int64
'''
# print(obj.values) #返回:[ 4 7 -5 3]
# print(obj.index) #返回:RangeIndex(start=0, stop=4, step=1)
#通常需要创建一个索引序列,用标签标识每个数据点:
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
# print(obj2)
'''
d 4
b 7
a -5
c 3
dtype: int64
'''
# print(obj2['b']) #返回7
# print(obj2[obj2 > 0])
'''
d 4
b 7
c 3
dtype: int64
'''
# print('b' in obj2) #返回True
#如果已经有数据包含在Python字典里,可以使用字典生成一个Series:
sdata = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
obj3 = pd.Series(sdata)
# print(obj3)
'''
a 1
b 2
c 3
d 4
dtype: int64
'''
#如果想要按照自己的顺序传递来构造函数,可以这么做:
states = ['c', 'b', 'e']
obj4 = pd.Series(sdata, index=states)
# print(obj4)
'''
c 3.0
b 2.0
e NaN #这里因为sdata里没有e的值,所以用NaN代替
dtype: float64
'''
# print(pd.isnull(obj4)) #缺失值的位置返回True
# print(pd.notnull(obj4)) #非缺失值的位置返回True
#Series中很重要的一个特性是“自动对齐索引”,两个不同的Series可以根据索引自动组合操作(比如加减乘除)
# print(obj3 + obj4)
'''
a NaN
b 4.0
c 6.0
d NaN
e NaN
dtype: float64
'''
#Series对象自身和其索引都有name属性,这个特性与pandas其他重要功能集成在一期
obj4.name = 'population'
obj4.index.name = 'state'
print(obj4)
'''
state
c 3.0
b 2.0
e NaN
Name: population, dtype: float64
'''
二、DataFrame
import pandas as pd
import numpy as np
#2、DataFrame
'''DataFrame表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被视为同一个共享相同索引的Series的字典。在DataFrame中,数据被存储为一个以上的二维块,而不是列表、字典或其他一维数组的集合。'''
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
print(frame)
# head选择头部的五行
print(frame.head())
#如果指定了列的顺序,DataFrame的列将会按照制定顺序排列
print(pd.DataFrame(data, columns=['year', 'state']))
#如果传的列不包含在字典中,将会在结果中出现缺失值
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five', 'six'])
print(frame2)
#下面是打印单列的两种方式:
print(frame2['year'])
print(frame2.state)
#用loc可以选取某些行
print(frame2.loc[['three', 'four']])
#列的引用是可以修改的,比如frame2里的空列:'debt'赋值为标量值或值数组:
frame2['debt'] = 16.5 #把这一列改为同一个值
frame2['debt'] = np.arange(6.) #将列表或数组赋值给一个列时,值的长度必须和DataFrame的长度相匹配
#将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排列,并在空缺的地方填充缺失值:
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
print(frame2)
#如果被赋值的列并不存在,则会生成一个新的列。del可以用来删除列
frame2['eastern'] = frame2.state == 'Ohio'
#注:frame2.eastern的语法无法创建新的列!
del frame2['eastern'] #删除列
#另一种常用的数据形式是包含字典的嵌套字典:
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop)
'''
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
'''
#可以对DataFrame进行转置操作(调换行和列):
print(frame3.T)
#内部字典的键被联合、排序后形成了结果的索引。如果已经显式指明索引的话,内部字典的键将不会被排序:
print(pd.DataFrame(pop, index=pd.Series([2000, 2001, 2002]))) #注,这里如果直接用index=[2000, 2001, 2002]会报错!
#包含Series的字典也可以用于构造DataFrame:
pdata = {'Ohio': frame3['Ohio'][:-1],
'Nevada': frame3['Nevada'][:2]}
print(pd.DataFrame(pdata))
#如果DataFrame的索引和列拥有name属性,则这些name属性也会被显示:
frame3.index.name = 'year'; frame3.columns.name = 'state'
print(frame3)
'''
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
'''
#和Series类似,DataFrame的values属性会将包含在DataFrame中的数据以二维ndarray的形式返回:
# print(frame3.values)
#如果DataFrame的列是不同的dtypes,则values的dtype会自动选择适合所有列的类型
'''
表:DataFrame构造函数的有效输入
类型 注释
2D ndarray 数据的矩阵,行和列的标签是可选参数
数组、列表和元素构成的字典 每个序列成为DataFrame的一列,所有的序列必须长度相等
NumPy结构化/记录化数组 与数组构成的字典一致
Series构成的字典 每个值成为一列,每个Series的索引联合起来形成结果的行索引,也可以显式地传递索引
字典构成的字典 每一个内部字典成为一列,键联合起来形成结果的行索引
字典或Series构成的列表 列表中的一个元素形成DataFrame的一行,字典键或Series索引联合起来形成DataFrame的列标签
列表或元组构成的列表 与2D ndarray的情况一致
其他DataFrame 如果不显示传递索引,则会使用原DataFrame的索引
NumPy MaskedArray 与2D ndarray的情况类似,但隐蔽值会在结果DataFrame中成为NA/缺失值
'''
三、索引对象
import pandas as pd
import numpy as np
'''pandas中的索引对象是用于存储轴标签和其他元数据的(例如轴名称或标签)。在构造Series或DataFrame时,你所使用的任意数组或标签序列都可以在内部转换为索引对象'''
obj = pd.Series(range(3), index=['a', 'b', 'c'])
index = obj.index
print(index[1:]) #返回:Index(['b', 'c'], dtype='object')
#索引对象是不可变的,因此用户是无法修改索引对象的,不变性使得在多种数据结构中分享索引对象更为安全
# index[1] = 'd' #这里会报错,TypeError
#与Python集合不同,pandas索引对象可以包含重复标签,根据重复标签进行筛选,会选取所有重复标签对应的数据:
dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])
print(dup_labels) #返回:Index(['foo', 'foo', 'bar', 'bar'], dtype='object')
'''
表:一些索引对象的方法和属性
方法 描述
append 将额外的索引对象粘贴到原索引后,产生一个新的索引
difference 计算两个索引的差集
intersection 计算两个索引的交集
union 计算两个索引的并集
isin 计算表示每一个值是否在传值容器中的布尔数组
delete 将位置i的元素删除,并产生新的索引
drop 根据传参删除指定索引值,并产生新的索引
insert 在位置i插入元素,并产生新的索引
is_monotonic 如果索引序列递增则返回True
is_unique 如果索引序列唯一则返回True
unique 计算索引的唯一值序列
'''