数据分析(一) -- pandas

本文介绍了pandas库中的核心概念,包括Series和DataFrame模块,详细讲解了它们的创建、索引、运算以及数据处理方法,如缺失数据处理、层次化索引、拼接和合并。还特别强调了数据聚合在数据分析中的重要性,特别是groupby()函数在数据分类处理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、pandas中的Series模块

Series 是一个类似数组的数据结构

  • 可以把Series看成一个定长的有序字典
    可以通过shape,size,index,values等得到series的属性
  • 可以通过head(),tail()快速查看Series对象的样式
  • 当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况
  • 可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据
  • Series对象本身及其索引都有一个name属性

Series的创建

由列表或numpy数组创建
默认索引为0到N-1的整数型索引

obj = Series([1,2,3,4])
print(obj)

输出:
0    1
1    2
2    3
3    4
dtype: int64

#还可以通过设置index参数指定索引
obj2 = Series([1,2,3,4],index=['a','b','c','d'])
obj2
输出:
a    1
b    2
c    3
d    4
dtype: int64

特别地,由ndarray创建的是引用,而不是副本。对Series元素的改变也会改变原来的ndarray对象中的元素。(列表没有这种情况)
a = np.array([1,2,3])
obj = Series(a)
obj
输出:
0    1
1    2
2    3
dtype: int64


obj[0]=0
print(a)
print(obj)
输出:
[0 2 3]
0    0
1    2
2    3
dtype: int64

用字典进行创建

obj = Series({'a':1,'b':2})
obj

输出:
a    1
b    2
dtype: int

Series的索引和切片


 - (1) 显式索引:
    - 使用index中的元素作为索引值
    - 使用.loc[](推荐)
    注意,此时是闭区间
 - (2) 隐式索引:
    - 使用整数作为索引值
    - 使用.iloc[](推荐)
    注意,此时是半开区间

Series的运算

  • 适用于numpy的数组运算也适用于Series
  • Series之间的运算 在运算中自动对齐不同索引的数据 如果索引不对应,则补NaN

二、pandas中的 DataFrame模块

  • DataFrame的创建
最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,
以字典的值(一个数组)作为每一列。
此外,DataFrame会自动加上每一行的索引(和Series一样)。
同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。
  • DataFrame的索引

 - 对列进行索引
 	通过类似属性的方式
 	例如:frame.name这样子
 	通过类似字典的方式
 	例如:frame['name']
 
 - 对行进行索引
 	使用.ix[]来进行行索引
 	使用.loc[]加index来进行行索引
 	使用.iloc[]加整数来进行行索引
 	
 - 对元素进行索引
	- 先使用列索引
	- 先使用行索引
	- 使用values属性(二维numpy数组)
	注意:
		直接用中括号时:
		索引表示的是列索引
		切片表示的是行切片
  • DataFrame的运算
    DataFrame之间的运算
    DataFrame的运算

Series与DataFrame之间的运算

axis=0:以列为单位操作(参数必须是列),对所有列都有效。

axis=1:以行为单位操作(参数必须是行),对所有列都有效。

三、pandas层次化索引

  • 创建多层索引

 - 隐式构造
Series也可以创建多层索引
 - 显示构造MultiIndex
使用数组的方式    Mindex = pd.MultiIndex.from_arrays([['a','a','b','b'],[1,2,1,2]])
使用tuple              Mindex = pd.MultiIndex.from_tuples([('a',1),('a',2),('b',1),('b',2)])

  • 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
a = np.random.randint(0,150,(2,8))
Mindex = pd.MultiIndex.from_product([['语文','数学','英语','理综'],['期中','期末']])
ddd = DataFrame(data = a,index = ['张三','李四'],columns = Mindex)
  • 多层索引对象的索引和切片操作

Series的操作

【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片
 - 索引   pop['California']
 - 切片   pop['California':'New York']
	      pop[::-1]
	      pop[:,2010]

DataFrame的操作


 - 可以直接使用列名称来进行列索引
 - 使用行索引需要用ix(),loc()等函数   【极其重要】推荐使用loc()函数
 - 注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!

  • 索引的堆
 - unstack()

【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里
  • 聚合操作
【注意】
需要指定level
【小技巧】和unstack()相反,聚合的时候,level等于哪一个,哪一个就保留

四、pandas拼接操作

  • 级联:pd.concat, pd.append

 - numpy 的级联
 np.concatenate([x,y,z])
 
 - 创建生成DataFrame的函数
 创建生成DataFrame的函数
 
 - 使用pd.concat()级联
 display(df1,df2,pd.concat([df1,df2]))

 - 使用pd.appnd()级联
x = make_df('AB',np.random.randint(10,size = 2))
y = make_df('AB',np.random.randint(10,20,size = 2))
display(x.append(y))
  • 合并:使用pd.merge()

 - 一对一合并
 df3 = pd.merge(df1,df2)
 - 多对一合并
 df3 = DataFrame({
    'employee':['Lisa','Jake'],
    'group':['Accounting','Engineering'],
    'hire_date':[2004,2016]})
 df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
                       'supervisor':['Carly','Guido','Steve']
                })
display(df3,df4,pd.merge(df3,df4))
 - 多对多合并
df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                 'group':['Accounting','Engineering','Engineering']})
df5 = DataFrame({'group':['Engineering','Engineering','HR'],
                'supervisor':['Carly','Guido','Steve']
                })
display(df1,df5,pd.merge(df1,df5))#多对多
display(pd.concat([df1,df5]))
 - key的规范化
  	使用on=显式指定哪一列为key
 	使用left_on和right_on指定左右两边的列作为key
 - 内合并与外合并
	内合并:只保留两者都有的key(默认模式)
	外合并 how='outer':补NaN
	左合并、右合并:how='left',how='right'
 - 列冲突的解决
	当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key

五、pandas数据处理

  • 删除重复元素
df = DataFrame({'color':['white','white','red','red','white'],
               'value':[2,1,3,3,2]})
display(df,df.duplicated(),df.drop_duplicates())

  • 映射

 - replace()函数:替换元素
 - map()函数:新建一列            !!!map中返回的数据是一个具体值,不能迭代
 - rename()函数:替换索引

  • 异常值检测和过滤

 - 使用describe()函数查看每一列的描述性统计量
 - 使用std()函数可以求得DataFrame对象每一列的标准差
 - 根据每一列的标准差,对DataFrame元素进行过滤。借助any()函数,对每一列应用筛选条件

  • 排序

 - 使用.take()函数排序
	可以借助np.random.permutation()函数随机排序
 - 随机抽样
	当DataFrame规模足够大时,直接使用np.random.randint()函数,就配合take()函数实现随机抽样

  • 数据聚合【重点】

数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
分组:先把数据分为几组
用函数处理:为不同组的数据应用不同的函数以转换数据
合并:把不同组得到的结果合并起来
数据分类处理的核心: groupby()函数


 - 数据分类处理的核心: groupby()函数
 	df = DataFrame({'color':['white','red','green','red'],
               'item':['ball','mug','pen','pencil'],
               'price1':np.random.rand(4),
               'price2':np.random.rand(4)})
	g = df.groupby('color')['price1']
	display(df,g,g.groups,type(g))
	display(g.sum(),g.mean(),g.max())


  • 高级数据聚合

 - 可以使用pd.merge()函数包聚合操作的计算结果添加到df的每一行
 - 可以使用transform和apply实现相同功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值