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())