《利用python进行数据分析》学习笔记(五)(上)

Pandas 是一种强大的数据处理工具,支持自动数据对齐、时间序列功能等。它提供了 Series 和 DataFrame 两种主要的数据结构,方便进行数学运算、数据筛选及排序等操作。

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

pandas

摘抄一下pandas的特点:

  • 具备按轴自动或显式数据对齐功能的数据结构。这可以防止许多由于数据未对齐以及来自不同数据源(索引方式不同)的数据而导致的常见错误。

  • 集成时间序列功能

  • 既能处理时间序列数据也能处理非时间序列数据的数据结构

  • 数学运算和简约(比如对某个轴求和)可以根据不同的元数据(轴编号)执行

  • 灵活处理缺失数据

  • 合并及其他出现在常见数据库(例如基于SQL的)中的关系型运算

pandas数据结构

Series

Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签(索引)组成。

# 创建Series对象,并指定index(如果没有指定,就自动从0到N)
obj = pd.Series([4,7,-5,3],index=['d','b','a','c'])

还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射,所以可以直接通过字典来创建

data = {'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj = pd.Series(data)

# 如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列,没有匹配上的值,将会变为NaN(not a number))
states = ['NewYork','Ohio','Oregon','Texas']
obj1 = pd.Series(data,index=states)

对于缺失值,我们可以运用isnullnotnull来检测缺失数据。
Series本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切

DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列。它既有行索引也有列索引,它可以被看作由Series组成的字典。

# 创建DataFrame
frame = pd.DataFrame(data,columns=['year','state'],index=['one','two'])

# 获取对应的Series,并且Series的name就是对应的columns
frame['state']
frame.year

# 指定添加新的列
frame['debt'] = 16.5

# 返回columns信息
frame.columns

对于嵌套字典

# 将嵌套字典传给DataFrame,它会解释为:外层字典的键作为列,内层键作行索引
pop  = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame = pd.DataFrame(pop)

# 可以进行转置,这样index和columns就互换了
frame.T
索引对象
obj = pd.Series(range(3),index=['a','b','c'])
index = obj.index

# index对象是不可修改的,以下操作会报错,这是为了保证index对象在多个数据结构之间安全共享
index[1] = 'd'

index的方法和属性
这里写图片描述

基本功能

重新索引

pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象

# 对index进行重新索引
obj.reindex(['a','b','c'],fill_value=0)

# 对index行和columns列都重新索引
frame.reindex(index=[...],method='ffill',columns=[...]

这里写图片描述
这里写图片描述

丢弃指定轴上的项

丢弃某条轴上的一个或多个项,drop方法返回的是一个在指定轴上删除了指定值的新对象

# 删除对象obj中以'c','b'为index的行
obj.drop(['c','b'])

# 删除对象obj中以'a'为columns的列
obj.drop('a',axis=1)
索引、选取和过滤
# Series
obj = Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
# 对于Series的索引,既可以使用index,又可以像类似于numpy一样使用整数
obj['b']
obj[0]
# 对于Series的切片也可以使用两种方式
## 取第一和第二个元素
obj[02]
## 取index为'b'到'c'的元素
obj['b':'c']
# 利用标签是要包含末端的,利用数字是不包含末端的


# DataFrame
data = DataFrame(np.arange(16).reshape((4, 4)),
                 index=['Ohio', 'Colorado', 'Utah', 'New York'],
                 columns=['one', 'two', 'three', 'four'])
# 可以通过切片或者布尔型数组选取行,整数只能在切片时使用,选取某行是不行的,比如data[0]会报错,除非使用ix,data.ix[0]
data[:2]
data[data['three'] > 5]
# 使用ix进行索引,先是行,后是列
data.ix[['Colorado', 'Utah'], [3, 0, 1]]
data.ix[data.three > 5, :3]

这里写图片描述

算术运算和数据对齐

pandas最重要的功能之一就是它可以对不同索引的对象进行算术运算,在进行对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。

s1 = Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
s1+s2

这里写图片描述
自动进行数据对齐,然后在不重叠的所引出引入NA值,对于DataFrame对齐操作同时发生在行和列上。
如果希望对于NA进行特殊值的填充,那么我们采用

df1.add(df2,fill_value=0)

这里写图片描述

DataFrame和Series之间的运算

默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一路向下广播,如果某个索引值在DataFrame的列或者Series的索引中找不到,则参与运算的两个对象机会被重新索引形成并集,并填充NA值。

frame = DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
                  index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = Series(range(3), index=['b', 'e', 'f'])
frame + series

这里写图片描述
当然也可以匹配行在列上广播,但是必须使用算术运算方法

series2 = frame['d']
frame.sub(series2,axis=0)

对frame的每一列减去series2。

函数应用和映射

Numpy的ufuncs(元素级数组方法)是可以用于操作pandas对象的

frame = DataFrame(np.random.randn(4, 3), columns=list('bde'),
                  index=['Utah', 'Ohio', 'Texas', 'Oregon'])
# ufuncs(abs)
np.abs(frame)

另一个常见操作是将函数应用到由各列或行所形成的一维数组上,运用DataFrame.apply

f = lambda x: x.max()-x.min()
# 默认axis=0,按列,即对每一列进行f操作
frame.apply(f)
# axis=1,按行
frame.apply(f,axis=1)

元素级的Python函数也是可以用的,使用applymap,即对DataFrame的每一个元素进行函数应用

# 得到frame中各个浮点值的格式化字符串
format = lambda x: '%.2f' % x
frame.applymap(format)

之所以叫applymap,是因为对于Series有一个元素级函数的map方法。

排序和排名

排序

frame = DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'],
                  columns=['d', 'a', 'b', 'c'])
# 按index排序,默认按升序排序
frame.sort_index()
# 按columns排序,可以使用降序排序
frame.sort_index(axis=1,ascending=False)
# 排序时,任何缺失值默认都会被放到Series的末尾

# 按值对Series进行排序,可使用其order方法
obj = Series([4, 7, -3, 2])
obj.order()
# 在DataFrame上,我们可能希望根据一个或多个列中的值进行排序,将一个或多个列的名字传递给by选项即可
frame = DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
frame.sort_index(by=['a', 'b'])

排名
即它会增设一个排名值(从1开始,一直到数组中有效数据的数量)。而且它可以根据某种规则破坏平级关系(平级关系,即两个数值相同,如何确定它们的关系)

# Series
obj = Series([7, -5, 7, 4, 2, 0, 4])
obj.rank()
obj.rank(method='first')
obj.rank(ascending=False, method='max')

# DataFrame
frame = DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],
                   'c': [-2, 5, 8, -2.5]})
# 对每一行进行排序
frame.rank(axis=1)

这里写图片描述

带有重复值的轴索引

对于重复值的轴索引,索引会返回所有带该索引的行或者列。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值