3.1.3 Series索引
包括:位置下标 / 标签索引 / 切片索引 / 布尔型索引
1. 位置索引
# 位置下标,类似序列 s = pd.Series(np.random.rand(5)) s
输出为:
Out[18]: 0 0.453055 1 0.208872 2 0.917167 3 0.238751 4 0.720561 dtype: float64
2. 标签索引
s = pd.Series(np.random.rand(5), index = ['a','b','c','d','e']) s
输出为:
Out[22]: a 0.037435 b 0.536072 c 0.051238 d 0.906477 e 0.474856 dtype: float64
3. 切片索引
# 切片索引 s1 = pd.Series(np.random.rand(5)) s2 = pd.Series(np.random.rand(5), index = ['a','b','c','d','e']) print('-----') print(s1[1:4],s1[4]) print(s2['a':'c'],s2['c']) print(s2[0:3],s2[3]) print('-----')
输出为:
----- 1 0.792143 2 0.876208 3 0.542396 dtype: float64 0.3478167781738142 a 0.338142 b 0.314807 c 0.716646 dtype: float64 0.7166457177011984 a 0.338142 b 0.314807 c 0.716646 dtype: float64 0.7435841750851758 -----
4. 布尔索引
s = pd.Series(np.random.rand(3)*100) s[4] = None # 添加一个空值 s
输出为:
Out[28]: 0 10.7214 1 72.9608 2 23.8594 4 None dtype: object
bs1 = s > 50 print(bs1, type(bs1), bs1.dtype)
输出为:
0 False 1 True 2 False 4 False dtype: bool <class ‘pandas.core.series.Series’> bool
3.1.5 Series基本操作技巧
本部分主要包括数据查看 / 重新索引 / 对齐 / 添加、修改、删除值等。
数据查看
# 数据查看 s = pd.Series(np.random.rand(50)) s.head(10) s.tail()
重新索引reindex
# 重新索引reindex # .reindex将会根据索引重新排序,如果当前索引不存在,则引入缺失值 s = pd.Series(np.random.rand(3), index = ['a','b','c']) s1 = s.reindex(['c','b','a','d'])
数据对齐
# Series对齐 数据对齐 s1 = pd.Series(np.random.rand(3), index = ['Jack','Marry','Tom']) s2 = pd.Series(np.random.rand(3), index = ['Wang','Jack','Marry']) s1 + s2
输出为:
Out[41]: Jack 0.954397 Marry 1.388826 Tom NaN Wang NaN dtype: float64
Series 和 ndarray 之间的主要区别是,Series 上的操作会根据标签自动对齐
index顺序不会影响数值计算,以标签来计算
空值和任何值计算结果仍然为空值
数据删除
In [44]: # 删除:.drop s = pd.Series(np.random.rand(5), index = list('ngjur')) s1 = s.drop(['g','j'])
输出为:
Out[46]: n 0.820846 u 0.321654 r 0.560360 dtype: float64
数据修改
# 修改 s = pd.Series(np.random.rand(3), index = ['a','b','c']) s[['b','c']] = 200 s
输出为:
Out[58]: a 0.933075 b 200.0 c 200.0 dtype: float64
3.2 DataFrame
3.2.1 Dataframe简介
DataFrame是一个结构类似于二维数组或表格的对象,与Series类对象相比,DataFrame类对象也由索引和数据组成,但该对象有两组索引,分别是行索引和列索引。
DataFrame类对象的行索引位于最左侧一列,列索引位于最上面一行,且每个列索引对应着一列数据。DataFrame类对象其实可以视为若干个公用行索引的Series类对象的组合。
3.2.2 创建DataFrame对象
demo_arr = np.array([['a', 'b', 'c'],['d', 'e', 'f']]) df_obj = pd.DataFrame(demo_arr,index = ['row_01','row_02'],columns=['col_01', 'col_02', 'col_03']) df_obj
输出为:
col_01 col_02 col_03 row_01 a b c row_02 d e f
3.2.3 Dataframe:索引
Dataframe既有行索引也有列索引,可以被看做由Series组成的字典(共用一个索引)
选择列 / 选择行 / 切片 / 布尔判断
1.选择行与列
# 选择行与列 df = pd.DataFrame(np.random.rand(12).reshape(3,4)*100, index = ['one','two','three'], columns = ['a','b','c','d']) print(df) data1 = df['a'] data2 = df[['a','c']] print(data1,type(data1)) print(data2,type(data2)) print('-----') # 按照列名选择列,只选择一列输出Series,选择多列输出Dataframe data3 = df.loc['one'] data4 = df.loc[['one','two']] print(data2,type(data3)) print(data3,type(data4)) # 按照index选择行,只选择一行输出Series,选择多行输出Dataframe
输出为:
2. df.loc[] - 按index选择行
# df.loc[] - 按index选择行 df1 = pd.DataFrame(np.random.rand(16).reshape(4,4)*100, index = ['one','two','three','four'], columns = ['a','b','c','d']) df2 = pd.DataFrame(np.random.rand(16).reshape(4,4)*100, columns = ['a','b','c','d']) print(df1) print(df2) print('-----') data1 = df1.loc['one'] data2 = df2.loc[1] print(data1) print(data2) print('单标签索引\n-----') # 单个标签索引,返回Series # data3 = df1.loc[['two','three','five']] #不再支持不存在的index,本例为'five' data4 = df2.loc[[3,2,1]] #print(data3) print(data4) print('多标签索引\n-----') # 多个标签索引,如果标签不存在,则返回NaN # 顺序可变 data5 = df1.loc['one':'three'] data6 = df2.loc[1:3] print(data5) print(data6) print('切片索引') # 可以做切片对象 # 末端包含 # 核心笔记:df.loc[label]主要针对index选择行,同时支持指定index,及默认数字index
输出为:
3. df.iloc[] - 按照整数位置(从轴的0到length-1)选择行
# df.iloc[] - 按照整数位置(从轴的0到length-1)选择行 # 类似list的索引,其顺序就是dataframe的整数位置,从0开始计 df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100, index = ['one','two','three','four'], columns = ['a','b','c','d']) print(df) print('------') print(df.iloc[0]) print(df.iloc[-1]) #print(df.iloc[4]) print('单位置索引\n-----') # 单位置索引 # 和loc索引不同,不能索引超出数据行数的整数位置 print(df.iloc[[0,2]]) print(df.iloc[[3,2,1]]) print('多位置索引\n-----') # 多位置索引 # 顺序可变 print(df.iloc[1:3]) print(df.iloc[::2]) print('切片索引') # 切片索引 # 末端不包含
输出为: