1. 程式人生 > 其它 >入門pandas—算術運算與多層索引

入門pandas—算術運算與多層索引

技術標籤:pythonpandas

算術運算

對除數為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