pandas中主要有两种数据结构:Series 和 DataFrame。
Series 是带有轴标签(索引)的一维数组。
DataFrame 是二维表格数据,有行索引也有列索引,可以看作是扩展的 Series。
Series 和 DataFrame 的区别
我们可以通过下面的例子来看看,Series 和 DataFrame 的区别。
import pandas as pd
dict1 = {'a':[1, 2, 3], 'b':[4, 5, 6], 'c':[7, 8, 9]}
s = pd.Series(dict1)
df = pd.DataFrame(dict1)
print("Series数据:")
print(s)
print('='*20)
print("DataFrame数据:")
print(df)
'''
Series数据:
a [1, 2, 3]
b [4, 5, 6]
c [7, 8, 9]
dtype: object
====================
DataFrame数据:
a b c
0 1 4 7
1 2 5 8
2 3 6 9
'''
对于相同的字典数据,Series 会将 key 当做索引,value 当做一维数组的值,每个索引对应一个列表数据,也就是一维数组的每个元素都是一个列表。而 DataFrame 会将 key 当做列索引,value 分别作为每列的值,建立了二维的表格数据,每个元素是一个数字。
Series 数据构建
创建 Series 的结构数据
import pandas as pd
# 创建一个 Series 的结构数据
s = pd.Series([3, -1, 6, -5, 0, 10], index=None) # index 默认是 None,也就是从 0 开始的序列数字
print('Series数据:')
print(s)
print('=' * 20)
print("索引(index):", s.index) # 这里是默认索引
print('=' * 20)
print('数据值(values):', s.values)
'''
Series数据:
0 3
1 -1
2 6
3 -5
4 0
5 10
dtype: int64
====================
索引(index): RangeIndex(start=0, stop=6, step=1)
====================
数据值(values): [ 3 -1 6 -5 0 10]
'''
指定Series的索引
import pandas as pd
s = pd.Series([3, -1, 6, -5, 0, 10], index=None) # 可以在这里的 index 中指定索引
s.index = ['d', 'b', 'f', 'e', 'a', 'c'] # 也可以单独指定
print('指定Series的index:')
print(s)
print('=' * 20)
print('重新定义index:')
s = s.reindex(['c', 'd', 'e', 'f', 'g']) # 如果索引本来就存在,则使用之前的值;如果不存在,就默认填充为 NaN。
print(s)
'''
指定Series的index:
d 3
b -1
f 6
e -5
a 0
c 10
dtype: int64
====================
重新定义index:
c 10.0
d 3.0
e -5.0
f 6.0
g NaN
dtype: float64
'''
更改 Series 的数值 (可以通过“索引序号”和“索引名称”两种方式来更改)
import pandas as pd
s = pd.Series([3, -1, 6, -5, 0, 10], index=['d', 'b', 'f', 'e', 'a', 'c'])
print('原始数值:')
print(s)
s[0] = 100 # 通过“索引序号”来访问元素
s['b'] = 99 # 通过“索引名称”来访问元素
print('=' * 20)
print('更改数值后:')
print(s)
'''
原始数值:
d 3
b -1
f 6
e -5
a 0
c 10
dtype: int64
====================
更改数值后:
d 100
b 99
f 6
e -5
a 0
c 10
dtype: int64
'''
Series 数据读取
Series 数据访问十分自由,既可以单独获取某一行或者某几行,也可通过切片访问,甚至可以通过条件筛选来访问。读取数据这里主要掌握两种方式:索引名称(标签)和索引序号(下标)。
import pandas as pd
s = pd.Series([3, -1, 6, -5, 0, 10], index=['d', 'b', 'f', 'e', 'a', 'c'])
print("Series 数据为:")
print(s)
# ============获取单行或者多行============
print("============获取单行或者多行(标签和序号两种方式)============")
print("获得单个值:")
print(s['d']) # 获取单个值,这里使用索引标签
# print(s[0]) # 跟上面的语句,这里使用索引序号
print('获得多行数据:')
# print(s[['d', 'e']]) # 获取多行数据,这里使用索引标签
print(s[[0, 3]]) # 跟上面的语句效果相同,这里使用索引序号
# ============切片访问============
# 索引名称(标签)切片
print("============切片访问(标签和序号两种方式)============")
print('索引名称(标签)切片:')
print(s['d':'f']) # “索引名称”的方式获取多行数据,前闭后闭
# print(s.loc['d':'f']) # 跟上面结果相同
# 索引序号(下标)切片
print("索引序号(下标)切片")
print(s[0:2]) # “索引序号(下标)”,前闭后开
# print(s.iloc[0:2]) # 跟上面结果相同
# ============通过条件筛选访问============
print("============通过条件筛选访问============")
print("筛选出值大于 0 的数据:")
print(s[s.values > 0])
# print(s.loc[s.values > 0]) # 跟上面语句功能相同
print("筛选出索引大于 d 的数据:")
print(s[s.index > 'd'])
# print(s.loc[s.index > 'd']) # 跟上面语句功能相同
'''
Series 数据为:
d 3
b -1
f 6
e -5
a 0
c 10
dtype: int64
============获取单行或者多行(标签和序号两种方式)============
获得单个值:
3
获得多行数据:
d 3
e -5
dtype: int64
============切片访问(标签和序号两种方式)============
索引名称(标签)切片:
d 3
b -1
f 6
dtype: int64
索引序号(下标)切片
d 3
b -1
dtype: int64
============通过条件筛选访问============
筛选出值大于 0 的数据:
d 3
f 6
c 10
dtype: int64
筛选出索引大于 d 的数据:
f 6
e -5
dtype: int64
'''
Series 排序、缺失值
对 Series 数据进行排序
import pandas as pd
import numpy as np
s = pd.Series([3, -1, 6, -5, 0, 10], index=['d', 'b', 'f', 'e', 'a', 'c'])
print(s)
# 排序
print("按照索引排序:")
print(s.sort_index())
print("按照值排序:")
print(s.sort_values(ascending=False))
'''
d 3
b -1
f 6
e -5
a 0
c 10
dtype: int64
按照索引排序:
a 0
b -1
c 10
d 3
e -5
f 6
dtype: int64
按照值排序:
c 10
f 6
d 3
a 0
b -1
e -5
dtype: int64
'''
Series 中的缺失值
import pandas as pd
import numpy as np
s = pd.Series([3, -1, 6, -5, 0, 10], index=['d', 'b', 'f', 'e', 'a', 'c'])
s = s.reindex(['a', 'b', 'c', 'h', 'm'])
print("原始的 Series 数据:")
print(s)
# 判定是否为缺失值
print("判定为缺失值:")
print(s.isnull())
# print(s.isna()) # 跟上一行语句作用相同
print("判定为不是缺失值:")
print(s.notnull())
# print(s.notna()) # 跟上一行语句作用相同
print("获取不是缺失值的数据:")
print(s[s.notnull()])
print("填充缺失值:")
s2 = s.fillna(100)
print(s2)
'''
原始的 Series 数据:
a 0.0
b -1.0
c 10.0
h NaN
m NaN
dtype: float64
判定为缺失值:
a False
b False
c False
h True
m True
dtype: bool
判定为不是缺失值:
a True
b True
c True
h False
m False
dtype: bool
获取不是缺失值的数据:
a 0.0
b -1.0
c 10.0
dtype: float64
填充缺失值:
a 0.0
b -1.0
c 10.0
h 100.0
m 100.0
dtype: float64
'''