Panads簡介
Panads存在兩種結構:
1、Series:
類似于一維數組的對象,由一組資料以及一組資料與之對應的索引組成
索引(Index)在左,值(Values)在右
索引是自動建立,也可以自己指定
2、DataFrame:
是一個表格類型的資料,含有一組有序的列,每列可以是不同的類型。
DataFrame既有行索引也有列索引,可以看做是 Series 組成的字典
資料以二維的形式存放
索引對象不允許修改,但可以對索引進行全部替換
Panads簡單讀取
'''
import pandas as pd
'''
Series
'''
ser = pd.Series([3, 4, 5, 6, 7, 8, 9])
print("左邊是索引,右邊是值:\n", ser)
# 擷取索引 和 值
print("擷取到的索引:", ser.index)
print("擷取到的值:", ser.values)
# 通過 索引 擷取 值
print("通過索引擷取值:", ser[6])
# 通過 dict 建構 Series head()返會全部
year = {2015: 15.6, 2017: 16.6, 2018: 19.9, 2019: 99.2, 2020: 99.2}
ser_year = pd.Series(year)
print("通過 dict 建構 Series:\n", ser_year)
# count 計算出現頻率
print("計算 value 值個數:", ser_year.count())
# unique 計算唯一值
print("計算 unique 唯一值:", ser_year.unique())
print("\n\n\n\n")
'''
DataFrame:
可以輸入給 DataFrame 構造器資料:
1、二維 ndarray
2、由數組、清單、元組組成的字典
3、由 Series 組成的字典
4、由字典組成的字典
5、另外一個 DataFrame
'''
frame = pd.DataFrame([7, 2, 3, 4, 5, 6])
print("建立 DataFrame:", frame.head())
# 通過 dict 建構 DataFrame
dict_data = {
"A": 1,
"B": "2019-04-06",
"C": pd.Series([1, 2, 3, 4]),
"D": ["Py", "Java", "C", "D"],
"E": "IT"
}
dict_frame = pd.DataFrame(dict_data)
print("通過 dict 字典形式 建立 DataFrame:", dict_frame)
# 通過索引擷取資料 dict_frame['D'] 擷取 dict_frame.D
print("通過索引,擷取資料(Series類型):", dict_frame['D'])
# 增加列資料
dict_frame['new'] = "我是新來的"
dict_frame['old'] = "我要被删除"
print("新增列:\n", dict_frame)
# 删除列
del dict_frame['old']
print("删除列:\n", dict_frame.head())
'''
ix:
dict_frame.ix[:,val]:選擇單個列
dict_frame.ix[val1,val2]:同時選取行和列
dict_frame.ix['A']:擷取指定索引對應的行資訊,ix表示索引字段
dict_frame.ix[:,'A']:擷取所有行的指定A列的資料
'''
print("擷取指定列的資訊:", dict_frame.ix[:, 'A'])
print("擷取指定行的資訊:", dict_frame.ix[2])
print("同時擷取行列資訊", dict_frame.ix[2, 'A'])
print("擷取所有行的某列資訊", dict_frame.ix[:, "D"])
'''
iloc:
根據下标索引進行通路,可以通路對應的行和列元素
loc:
根據下标索引進行通路,可以通路對應的行和列資訊
基本類似于 ix[]
'''
print("iloc 通路對應行和列資訊:", dict_frame.iloc[:, 3])
print(dict_frame.loc[:, :])
Panads簡單計算
import numpy as np
import pandas as pd
frame = pd.DataFrame(np.random.randint(10, size=(5, 4)), columns=['a', 'b', 'c', 'd'])
print("初始化資料:\n", frame)
'''
常用操作:
sum():求和
mean():平均
max():最大值
min():最小值
describe():産生多個統計資料(count,mean,std,min)
query():類似 filter 過濾
count 非Nan數量
argmin、argmax 計算最大值或最小值對應的索引位置
quantile 計算樣本的分位數(0-1)
median 中位數
mad 平均絕對離差
var 樣本方差
std 樣本的标準差
skew 樣本值的偏度----正态分布的偏度為0
kurt 樣本值的峰度------正态分布的峰度為3
cumsum樣本值的累計和
axis :
預設為 0
0 :列
1 :行
skipna:
True:計算
False:如果有 NaN 則值為 NaN
'''
# 修改部分值為 nan
frame.ix[0, 'a'] = np.nan
frame.ix[0, 'd'] = np.nan
frame.ix[2, 'c'] = np.nan
print("修改部分值為NaN:\n", frame)
# 求和
print("求和:\n", frame.sum(skipna=True))
# 求平均
print("求平均:\n", frame.mean(skipna=False))
# 求最值
print("最大值為:", frame.max(), "最小值為:", frame.min())
print("========================= \n")
# 生成多個統計資料
print("describe 産生多個統計資料:\n", frame.describe())
# query
df = pd.DataFrame(np.random.rand(10, 2), columns=list("ab"))
print("query : \n", df.query('a>b'))
Panads 函數運用(處理缺失值)
import pandas as pd
import numpy as np
'''
處理缺失值:
1、生成原始資料
2、判斷資料是否缺失
3、丢棄缺失資料
4、填充缺失資料
補充:
applymap() :将函數應用到每個資料上
apply() :将函數應用到行或列資料
index() :
索引排序,預設升序排序 , ascending = False 為降序排序
按 Index 排序 sort_index
按 Values 排序 sort_values(by='colonum')
'''
'''
1.生成原始資料:
DataFrame可接受的資料:
1、ndarray 二維數組
2、由數組、清單、元組組成的字典
3、由 Series 組成的字典
4、由 字典 組成的字典
5、另外一個 DataFrame
'''
df_data = pd.DataFrame([[1, 2, 3], [4., 5., np.nan], [np.nan, 6., np.nan], [6., 7., 8.]])
print("1、生成原資料:\n", df_data)
# 2、判斷資料是否确實
print("2、判斷資料是否為空:\n", df_data.isnull())
# 3、丢棄 缺失 資料 axis(0 -- 列,1 -- 行) :根據次元丢棄
print("3、丢棄缺失資料:\n", df_data.dropna())
# 4、填充缺失資料
print("4、填充缺失資料為 100.:\n", df_data.fillna(100.))
# applymap 将函數運用到所有的資料上
f2 = lambda x: x * x
print("applymap 将函數運用到所有的資料上:\n", df_data.applymap(f2))
# 使用apply應用行或列資料
f1 = lambda x: x.max()
print("apply應用行或列資料:\n", df_data.apply(f1))
# 排序
print("根據 Index 排序後的資料:\n", df_data.sort_index)
print("根據 Values 排序後的資料:\n", df_data.sort_values(by=2))
Panads 層級索引
'''
層級索引:
在輸入索引Index時,輸入了由兩個子list組成的list,第一個子list是外層索引,第二個list是内層索引。
'''
import pandas as pd
import numpy as np
ser = pd.Series(np.arange(1, 11, 1),
index=[
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd'],
[0, 1, 2, 0, 1, 3, 0, 1, 2, 3]
])
print("層級索引原資料:\n", ser)
# 索引類型 MultiIndex
print("索引類别:", type(ser.index))
'''
levels:
表示兩個層級中分别有哪些标簽
codes:
每個位置分别是什麼标簽
'''
print("列印索引:", ser.index)
'''
選取子集:
根據索引擷取資料:
現在有兩層資料,當通過外層索引擷取資料的時候,可以直接利用外層索引标簽來擷取
當要通過内層索引擷取資料的時候,在 list 中傳入兩個元素:
前者表示要選取的外層索引
後者表示要選取的内層索引
常用于分組操作、透視表的生成等
'''
# 擷取外層資料
print("外層索引資料:\n", ser['b'])
# 擷取内層資料 前者表示外層索引,後者表示内層索引
print("内層索引資料:\n", ser[:, 1])
'''
交換分層排序:
swaplevel():交換内層與外層索引
'''
print("交換内層與外層索引:\n", ser.swaplevel())
'''
交換并分層排序:
sort_index():先對外層索引進行排序,再對内層索引進行排序,預設是升序
sort_value():先對外層索引進行排序,再對内層索引進行排序,預設是升序
'''
print("交換并分層排序:\n",ser.swaplevel().sort_index())