索引操作
- series类对象属于一维结构,只有行索引,儿dataframe类对象属于二维结构,他同时拥有行索引和列索引,所以他们的索引操作也有所不同
series的索引操作
- 既可以通过索引的名称获取也可以通过索引的位置来获取
ser_obj = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
ser_obj[0] # 通过索引位置进行获取数据
ser_obj['a'] #通过索引名称进行获取
out:1
- 切片:使用位置进行切片和列表切片一样既包含起始点不包含终止点,如果使用索引名称进行切片,既包含起始点也包含终止点。
ser_obj[0:2] # 使用索引位置进行切片
a 1
b 2
dtype: int64
ser_obj['a':'c'] #使用索引名称进行切片
a 1
b 2
c 3
dtype: int64
*切片获取不连续的数据
ser_obj[::2] #使用索引位置进行切片
a 1
c 3
e 5
dtype: int64
ser_obj[['a','c','e']] #使用索引名称进行切片
a 1
c 3
e 5
dtype: int64
- 布尔索引同样适用
ser_obj[ser_obj>2]
c 3
d 4
e 5
dtype: int64
DataFrame的索引操作
- DataFrame的每列数据都是一个Series对象,我们可以通过列索引进行获取
import numpy as np
arr = np.arange(12).reshape(3,4)
arr_df = pd.DataFrame(arr,columns=['a','b','c','d'])
arr_df
OUT:a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
arr_df[['a','c']]
OUT:a c
0 0 2
1 4 6
2 8 10
arr_df[0:1][['a','b']]
OUT:a b
0 0 1
算术运算与数据对齐
- pandas在执行算术运算时,会按照索引进行对齐。Series根据行索引对齐,DataFrame是根据行索引和列索引对齐
obj_1 = pd.Series(range(10,13))
obj_2 = pd.Series(range(20,25))
obj_1 + obj_2 #使用NaN进行填充
OUT:
0 30.0
1 32.0
2 34.0
3 NaN
4 NaN
dtype: float64
obj_1.add(obj_2,fill_value=0) # 填充值改为0
OUT:
0 30.0
1 32.0
2 34.0
3 23.0
4 24.0
dtype: float64
数据排序
- pandas中按索引进行排序的方法是:sort_index()方法。该方法可以使用行索引或者列索引进行排序
- sort_index(axis=0,level=None,ascending=True,inplace=False,kind=‘quicksort’,na_position=‘last’,sort_remaining=True)
axis:轴索引 0 index 1 columns
level:若不为None,则对指定索引级别的值进行排序
ascending:是否升序排列,默认为True,表示升序
inplace:默认为False,表示对数据表进行排序,不创建新的实例
kind:选择排序算法
# 对Series数据排序
ser_obj = pd.Series(range(10,15),index=[5,2,4,3,1])
ser_obj
5 10
2 11
4 12
3 13
1 14
dtype: int64
ser_obj.sort_index() #索引升序排序
1 14
2 11
3 13
4 12
5 10
dtype: int64
ser_obj.sort_index(ascending=False) #索引降序排序
5 10
4 12
3 13
2 11
1 14
dtype: int64
#对DataFrame数据进行排序
df_obj = pd.DataFrame(np.arange(9).reshape(3,3),index=[4,3,5]
df_obj.sort_index(axis=1) #按列索引排序
OUT:0 1 2
4 0 1 2
3 3 4 5
5 6 7 8
df_obj.sort_index(ascending=False) #按行索引降序排序
OUT:0 1 2
5 6 7 8
4 0 1 2
3 3 4 5
按值排序
- pandas中按值排序的方法为sort_values()
- sort_values(by,axis=0,ascending=True,inplace=Flase,kind=‘quicksort’,na_position=‘last’)
axis:轴索引 0 index 1 columns
level:若不为None,则对指定索引级别的值进行排序
ascending:是否升序排列,默认为True,表示升序
inplace:默认为False,表示对数据表进行排序,不创建新的实例
kind:选择排序算法
by:表示排序的列
na_position:first会将nan值放在开头,last会将nan值放在最后
ser_obj = pd.Series([4,np.nan,6,np.nan,-3,2])
ser_obj
0 4.0
1 NaN
2 6.0
3 NaN
4 -3.0
5 2.0
dtype: float64
ser_obj.sort_values()
4 -3.0
5 2.0
0 4.0
2 6.0
1 NaN
3 NaN
dtype: float64
df_obj.sort_values(by=1) #针对列数为1进行值排序
0 1 2
4 0 1 2
3 3 4 5
5 6 7 8
统计计算与描述
函数名称 | 说明 | 函数名称 | 说明 |
---|---|---|---|
sum | 计算和 | std | 样本值的标准差 |
mean | 计算平均值 | skew | 样本值的偏度(三阶矩) |
median | 获取中位数 | kurt | 样本值的峰度(四阶矩) |
max,min | 获取最大值或最小值 | cumsum | 样本值的累计和 |
idxmax,idxmin | 获取最大索引值和最小索引值 | cummin,cummax | 样本值的累计最小值和累计最大值 |
count | 计算非NaN值的个数 | cumprod | 样本值的累计积 |
head | 获取前N个值 | describe | 对Series和DataFrame列计算汇总统计 |
var | 样本值的方差 |
DataFrame默认有限以纵向轴进行计算,axis=1即为计算横轴的数据
统计描述
- 如果希望一次型输出多个统计指标可以使用describe()实现
describe(percentiles=None,include=None,exclude=None)
- percentiles:输出中包含的百分数,位于[0,1]之间,如果不设置本参数,则默认为[0.25,0.5,0.75],返回25%,50%,75%分位数
- include,exclude:返回结果的形势
df_obj = pd.DataFrame([[12,6,-11,19],[-1,7,50,36],[5,9,23,28]])
df_obj
0 1 2 3
0 12 6 -11 19
1 -1 7 50 36
2 5 9 23 28
df_obj.describe() # 调用本函数进行操作
0 1 2 3
count 3.000000 3.000000 3.000000 3.000000
mean 5.333333 7.333333 20.666667 27.666667
std 6.506407 1.527525 30.566867 8.504901
min -1.000000 6.000000 -11.000000 19.000000
25% 2.000000 6.500000 6.000000 23.500000
50% 5.000000 7.000000 23.000000 28.000000
75% 8.500000 8.000000 36.500000 32.000000
max 12.000000 9.000000 50.000000 36.000000
层次化索引
- 之前涉及的pandas对象都是一层索引结构(行索引,列索引),又称为单层索引,层次化索引可以理解为单层索引的延申,即在一个轴上具有多层索引
- 两层索引:内层索引 外层索引
创建具有两层索引的Series对象
import pandas as pd
mulitindex_series = pd.Series([15848,13472,12073.8,7318,7446,6444,15230,8269],
index=[['河北省','河北省','河北省','河北省',
'河南省','河南省','河南省','河南省'],
['石家庄市','唐山市','邯郸市','秦皇岛市',
'郑州市','开封市','洛阳市','新乡市']])
mulitindex_series
河北省 石家庄市 15848.0
唐山市 13472.0
邯郸市 12073.8
秦皇岛市 7318.0
河南省 郑州市 7446.0
开封市 6444.0
洛阳市 15230.0
新乡市 8269.0
dtype: float64
- 在使用构建方法创建series对象时,index接受了一个嵌套列表来设置索引的层级,嵌套的第一个列表作为外层索引,第二个列表作为内层索引
创建具有两层索引的DataFrame对象
import pandas as pd
from pandas import DataFrame,Series
#占地面积为增加的列索引
mulitindex_df = DataFrame({'占地面积 ':[15848,13472,12073.8,7318,7446,6444,15230,8269]},
index=[['河北省','河北省','河北省','河北省',
'河南省','河南省','河南省','河南省'],
['石家庄市','唐山市','邯郸市','秦皇岛市',
'郑州市','开封市','洛阳市','新乡市']])
mulitindex_df
OUT:
占地面积
河北省 石家庄市 15848.0
唐山市 13472.0
邯郸市 12073.8
秦皇岛市 7318.0
河南省 郑州市 7446.0
开封市 6444.0
洛阳市 15230.0
新乡市 8269.0
- 除了使用这两种方法创建MultiIndex以外,还可以通过MultiIndex类的方法构建一个层次化索引
- MultiIndex.from_tuples():将元组列表转换为MultiIndex
- MultiIndex.from_arrays():将数组列表转换为MultiIndex
- MultiIndex.from_products():从多个集合的笛卡尔积种创建一个MultiIndex
- MultiIndex对象由三个属性
- level:每个级别的唯一标签
- labels:每一个索引列中每个元素在level种对应第几个元素
- names:设置索引等级名称
- 通过MultiIndex.from_tuples创建MultiIndex对象
#根据元组创建一个Multiindex对象
mulitindex_index = MultiIndex.from_tuples(tuples=lists_tuple,names=['外层索引','内层索引'])
mulitindex_index
MultiIndex([('A', 'A1'),
('A', 'A2'),
('B', 'B1'),
('B', 'B2'),
('B', 'B3')],
names=['外层索引', '内层索引'])
values = [[1,2,3],[8,5,7],[4,7,7],[5,5,4],[4,9,9]]
df_index = pd.DataFrame(data=values,index=mulitindex_index,columns=['a','b','c'])
df_index
a b c
外层索引 内层索引
A A1 1 2 3
A2 8 5 7
B B1 4 7 7
B2 5 5 4
B3 4 9 9
#根据array对象创建一个Multiindex对象
mulit_array = MultiIndex.from_arrays(arrays=[['A','B','A','B','B'],['A1','A2','B1','B2','B3']],names=['外层索引','内层索引'])
mulit_array
MultiIndex([('A', 'A1'),
('B', 'A2'),
('A', 'B1'),
('B', 'B2'),
('B', 'B3')],
names=['外层索引', '内层索引'])
values = np.array([[1,2,3],[8,5,7],[4,7,7],[5,5,4],[4,9,9]])
df_array = pd.DataFrame(data=values,index=mulit_array)
df_array
0 1 2
外层索引 内层索引
A A1 1 2 3
B A2 8 5 7
A B1 4 7 7
B B2 5 5 4
B3 4 9 9
#根据笛卡尔积创建一个Multiindex对象
number = [0,1,2]
colors = ['green','purple']
mulit_product = pd.MultiIndex.from_product(iterables=[number,colors],names=['number','colors'])
mulit_product
MultiIndex([(0, 'green'),
(0, 'purple'),
(1, 'green'),
(1, 'purple'),
(2, 'green'),
(2, 'purple')],
names=['number', 'colors'])
values = np.array([[5,6],[8,9],[5,1],[1,5],[3,4],[8,5]])
df_product = pd.DataFrame(data=values,index=mulit_product)
df_product
0 1
number colors
0 green 5 6
purple 8 9
1 green 5 1
purple 1 5
2 green 3 4
purple 8 5