入门pandas—算术运算与多层索引

算术运算

对除数为0的处理:
1/0 = inf 无穷大
-1/0 = -inf 负无穷大
0/0 = Nan

处理空值

方法一:将空值填充为0

import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/计算.xlsx'
data = pd.read_excel(path)
i = data['1店'].fillna(0)+data['2店'].fillna(0)   #NAN的用空值填
print(i)
0    8.0
1    1.0
2    1.0
3    0.0
4    0.0

方法二:灵活算术法

import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/计算.xlsx'
data = pd.read_excel(path)
i = data['1店'].add(data['2店'],fill_value=0)   #只是把一店和二店的nan填上0
print(i.fillna(0))  #把i为na的也填成0
0    8.0
1    1.0
2    1.0
3    0.0
4    0.0

在这里插入图片描述

处理inf无穷大(分母为0)

加入代码 pd.options.mode.use_inf_as_na = True

import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/计算.xlsx'
data = pd.read_excel(path)
i = data['1店'].div(data['2店'],fill_value=0)
print(i)
0    1.666667
1    0.000000
2         inf
3         NaN
4         NaN

加入代码

import pandas as pd
pd.options.mode.use_inf_as_na = True
path = 'C:/Users/Administrator/Desktop/playground2/计算.xlsx'
data = pd.read_excel(path)
i = data['1店'].div(data['2店'],fill_value=0)
print(i)
0    1.666667
1    0.000000
2         NaN
3         NaN
4         NaN

多层索引

分层索引的设置与查询

index为有序(数字和字母)
原数据

   班级 学号  分数
0  1班  a   1
1  1班  b   2
2  1班  c   3
3  2班  a   4
4  2班  b   5
5  2班  c   6
6  3班  a   7
7  3班  b   8
import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/多层索引.xlsx'
data = pd.read_excel(path,index_col=[0,1],sheet_name='有序')  # index_col将第0列(班级)设为一层索引,第2列(学号)设为二层索引
print(data)
      分数
班级 学号    
1班 a    1
   b    2
   c    3
2班 a    4
   b    5
   c    6
3班 a    7
   b    8

查询

import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/多层索引.xlsx'
data = pd.read_excel(path,index_col=[0,1],sheet_name='有序')
data2 = data.loc[('1班',slice(None)),:]   #slice(None)不能省略 不能改成,:,代表取一班任意学号,全部列
print(data2)
       分数
班级 学号    
1班 a    1
   b    2
   c    3
data2 = data.loc[('1班','a'),:]  
print(data2)
分数    1

index为无序(中文)

print(数据.data.is_lexsorted()) # 检查index是否有序
False
import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/多层索引.xlsx'
data = pd.read_excel(path,index_col=[0,1],sheet_name='无序')
data.sort_index(level = '科目')    #先对第一层索引进行排序
data2 = data.loc[('语文',slice(None)),:]  #再取值
print(data2)
       分数
科目 得分    
语文 最高  90
   最低  50

多层索引的创建的方式【行】

推荐使用第三种(笛卡尔积)

多层索引 = pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]],names=['x','y'])
多层索引 = pd.MultiIndex.from_tuples([('a',1),('a',2),('b',1),('b',2)],names=['x','y'])
多层索引 = pd.MultiIndex.from_product([['a', 'b'], [1, 2]],names=['x','y'])
MultiIndex([('a', 1),
            ('a', 2),
            ('b', 1),
            ('b', 2)],
           names=['x', 'y'])

都是创建第一层索引x中 对应 a,b 第二层索引y中对应1,2

注:如果不在MultiIndex中设置索引名,也可以事后设置

数据.index.names = ['x', 'y']

多层索引的创建的方式【列】

import pandas as pd
import numpy as np
data = np.random.randn(4,4)
ind = pd.MultiIndex.from_product([[2010,2016],[5,6]],names=['年','月'])  #行索引
col = pd.MultiIndex.from_product([['西瓜','哈密瓜'],['黄瓜','番茄']],names=['水果','蔬菜'])  #列索引
data2 = pd.DataFrame(data = data,index=ind,columns=col)  #行列索引一一对应
print(data2)

分层索引计算

import pandas as pd
path = 'C:/Users/Administrator/Desktop/playground2/销售.xlsx'
data = pd.read_excel(path,header=[0,1])   #将第一行第二行设置为列索引
print(data.columns)
MultiIndex([('土豆', '销量'),
            ('土豆', '毛利'),
            ('倭瓜', '销量'),
            ('倭瓜', '毛利')],
           )

原数据

   土豆     倭瓜   
   销量 毛利  销量 毛利
0  10  5  20  6
1  11  4  30  5
data1 = data['土豆','销量']+data['倭瓜','销量']  #土豆和倭瓜的销量
print(data1)
0    30
1    41
data1 = data['土豆']+data['倭瓜']   #第二层索引下一一相加
print(data1)
   销量  毛利
0  30  11
1  41   9
data1 = data['土豆']+data['倭瓜']
print(data1.columns)  #此时索引是销量和毛利  需要加上第一层索引
Index(['销量', '毛利'], dtype='object')
data1 = data['土豆']+data['倭瓜']
data1.columns = pd.MultiIndex.from_product([['总计'],data1.columns])  #重新设置索引 总计为一层索引,原有的为二层索引
print(data1)
   总计    
   销量  毛利
0  30  11
1  41   9
data1 = data['土豆']+data['倭瓜']
data1.columns = pd.MultiIndex.from_product([['总计'],data1.columns])  #重新设置索引 总计为一层索引,原有的为二层索引
data3 = pd.concat([data,data1],axis=1)  #横向拼接
print(data3)
   土豆     倭瓜     总计    
   销量 毛利  销量 毛利  销量  毛利
0  10  5  20  6  30  11
1  11  4  30  5  41   9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,pandas执行算术运算时会先按照索引对齐数据。具体来说,如果两个Series具有相同的索引,则它们的值将按照相应的索引位置进行运算。如果两个Series具有不同的索引,则在运算时会使用NaN(Not a Number)填充缺失的值。例如,考虑以下两个Series: ``` import pandas as pd s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c']) s2 = pd.Series([4, 5, 6], index=['b', 'c', 'd']) ``` 在这个例子中,s1和s2具有不同的索引。如果我们执行s1 + s2,结果将是: ``` a NaN b 6.0 c 8.0 d NaN dtype: float64 ``` 在这个结果中,s1和s2中缺失的值被填充为NaN,而仅存在于其中一个Series中的值也被视为缺失值。这种按照索引对齐数据的功能是pandas的一个强大特性,它使得数据对齐和处理变得更加简单和高效。 ### 回答2: 在Pandas中,执行算术运算时会先按照索引进行操作。Pandas提供了对索引对齐的支持,这意味着在执行算术运算之前会先对操作的对象的索引进行对齐,确保相同索引位置的元素会被正确地匹配。 具体而言,如果两个Series对象进行算术运算,它们的索引会进行对齐。如果一个索引在一个Series中存在而在另一个Series中不存在,那么对应位置的结果会是缺失值(NaN)。而如果两个DataFrame对象进行算术运算,除了对行索引进行对齐外,还会对列索引进行对齐。 除了对齐的自动操作,Pandas还提供了一些处理对齐操作中缺失值的方法。例如,可以使用`fill_value`参数来指定在对齐时将缺失值填充为指定的数值。另外,还可以使用`add()`,`sub()`,`mul()`,`div()`等方法来执行具有灵活性的算术运算,其中可以指定填充缺失值的方式。 总之,Pandas执行算术运算时会先按照索引进行对齐,确保相同索引位置的元素会被正确地匹配,并能够灵活处理缺失值的情况。这种对齐操作使得在处理数据时更加方便和准确。 ### 回答3: Pandas是一个强大的数据分析工具,它提供了许多灵活的功能来处理数据。在执行算术运算时,Pandas会首先根据索引来进行操作。 当进行算术运算时,Pandas会按照两个数据集的索引进行匹配。如果两个数据集具有相同的索引,那么对应位置的值将进行运算;如果两个数据集的索引不完全匹配,那么Pandas会将缺失的索引位置填充为NaN(Not a Number)。 例如,假设我们有两个Series数据集,分别为"A"和"B",它们的索引分别是[1, 2, 3]和[2, 3, 4]。如果我们执行"A + B"的运算Pandas会首先根据索引进行匹配,得到的结果是: 索引1:A中对应位置的值 + NaN = NaN 索引2:A中对应位置的值 + B中对应位置的值 = 对应位置的结果 索引3:A中对应位置的值 + B中对应位置的值 = 对应位置的结果 索引4:NaN + B中对应位置的值 = NaN 运算的结果将会是一个新的Series,它的索引是两个数据集索引的并集,值是按照索引位置进行运算得到的结果。 需要注意的是,当进行算术运算时,Pandas还可以根据不同的运算方式(如+、-、*、/等)进行相应的元素级运算。此外,Pandas还提供了一些方法来处理缺失值,如dropna()和fillna()等,以便进行数据清洗和处理。总之,Pandas算术运算功能非常灵活,可以满足不同类型的数据处理需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值