Pandas(2)

索引操作

  • 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类的方法构建一个层次化索引
  1. MultiIndex.from_tuples():将元组列表转换为MultiIndex
  2. MultiIndex.from_arrays():将数组列表转换为MultiIndex
  3. MultiIndex.from_products():从多个集合的笛卡尔积种创建一个MultiIndex
  • MultiIndex对象由三个属性
  1. level:每个级别的唯一标签
  2. labels:每一个索引列中每个元素在level种对应第几个元素
  3. 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
​

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ashan927

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值