入門pandas—算術運算與多層索引
阿新 • • 發佈:2021-02-02
算術運算
對除數為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