Pandas 基礎知識2
1 pandas 分組計算
import pandas as pd
import numpy as np
df = pd.DataFrame({
'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':np.random.randint(1,10,5),
'data2':np.random.randint(1,10,5)
})
df['data1'].groupby(df['key1']).mean()# df二維數組的data1這一列根據key1分組并求平均值
# 依據多個清單分組
df['data1'].groupby([df['key1'],df['key2']]).sum() # sum求和,.size()求個數
df.groupby('key1').sum()['data1'] # 直接對表進行分組,求和
mean = df.groupby(['key1','key2']).sum()['data1']
mean.unstack() # 将series轉換為dataframe數組
# 支援for循環疊代
for name,group in df.groupby('key1'):
print(name)
print(group)
df.groupby(df.dtypes,axis = 1).sum() # 根據列分組 橫着分組
# 根據字典分組
df = pd.DataFrame(np.random.randint(1,10,(5,5)),
columns = list('abcde'),
index = ['alice','bob','candy','dark','emily'])
df.iloc[1,1:3] = np.nan
pandas 聚合函數
# pandas 内置聚合函數
# sum()/mean()/max()/min()/describe
# 自定義聚合函數 df.agg(自定義聚合函數名) 自定義函數不需要加''号
# df.agg([‘内置聚合函數1’,‘内置聚合函數2’,(對聚合函數作用後的列重新命名,聚合函數3)])
# 可以利用字典
# d = {'列1':'内置聚合函數1','内置聚合函數2',('聚合函數生成的列重新命名',自定義聚合函數)}
# df.agg(d)
pandas 檔案讀取
讀檔案
# 有列名稱
# pd.read_csv('檔案名')
# pd.read_table('檔案名',sep = '分割符')
# 無列名稱
# pd.read_csv('檔案名',header = None,names = [列名稱清單])
# pd.read_csv('檔案名',header = None,names = [列名稱清單],index_col = [行名稱清單1,行名稱清單2])
# 以上方法指定多重索引
# 分隔符不規則
# 正規表達式
# pd.read_table('檔案名',sep = '正規表達式') \s+
# 缺失值的處理
# pd.read_csv('檔案名',na_values = [當成缺失值的清單]) #針對整個數組指定缺失值
# 針對每一列指定缺失值
# pd.readn_csv('檔案名',na_values = {'列1':[缺失值清單],'列2':[缺失值清單]})
# 方塊讀取資料
# pd.read_csv('檔案名',nrows = 行數) # 讀取資料中固定行數的内容
# tr = pd.read_csv('檔案名',chunksize = 行數) 每次讀取檔案中固定的行數,放在tr變量中
# tr 可以疊代
# result = pd.Series([]) # 建立結果容器
# for chunk in tr: # meiyige chunk 都是一個固定行數的dataframe
# result = result.add(chunk['列名'].values_count(),fill_value = 0)
寫檔案
# df.to_csv('檔案名',index = False) # index = False 不寫索引
# df.to_csv('檔案名',index = False,header = None,columns = [列名],sep = 分隔符)
# header 不寫列索引,columns 指定寫入哪些列到磁盤
Pandas資料可視化
import pandas as pd
import numpy as np
#一維 折線圖
ts = pd.Series(np.random.randn(1000),index = pd.date_range('20100101',periods = 1000)) # 建立對象
ts = ts.cumsum() # 求累加和
ts.plot(title = 'cumsum',style = 'r-',figsize = (8,6)); # 折線圖
# 二維 折線圖
df = pd.DataFrame(np.random.randn(1000,4),index = ts.index,columns = list('abcd'))
df = df.cumsum()
df.plot(subplots = True,figsize = (6,8),sharey = True); # subplots 将每個子圖單獨畫出來 sharey 使坐标y一緻
# 二維 柱狀圖
# 柱狀圖 plot(kind = 'bar') 或者plot.bar(h) 水準(垂直)
df.iloc[0].plot(kind = 'bar')
df.plot.bar(stacked = True) #括号内可以指定參數stacked = True 接力畫
# 直方圖
df['a'].hist(bins = 20,alpha = 0.3,stacked = True) # 直方圖 bins 柱子個數, alpha 指定透明度,stacked 指定接力形式
df.plot.hist(subplots = True,sharex = True,sharey = True,bins = 50);
# 機率密度
df['a'].plot.kde() # 機率密度
# 散布圖
df.plot.scatter(x= 'a',y = 'b') # 散布圖
# 餅圖
s.plot.pie()
pandas時間序列
# python datetime子產品
# from datetime import datetime
# from datetime import timedelta
# python 時間
# now = datetime.now 現在的時間
# now.year,now.month,now.day #datetime year month day 屬性
# date1 = datetime(2019,12,31)
# date2 = datetime(2020,6,30) # datetime 建立時間
# deltatime = date1 - date2
# deltatime.days # 差的天數
# deltatime.total_seconds() # 差的秒數
# timedelta(4.5)+date1 #date1 + 4.5 天
# date1.strftime('%y/%m%d' %H:%M:%S) # 時間轉換為字元串
# datetime.strptime('2019-02-20 9:30','%Y-%m-%d %H:%M') # 字元串轉換成時間
# pandas時間序列
# dates = [datetime(2016,3,1),datetime(2016,4,1),datetime(2016,5,1)] #建立時間序列清單
# s = pd.Series(np.random.randn(4),index = dates) # 根據時間清單建立
# 生成時間戳的時間序列的方法
# pd.date_range('開始時間','結束時間'/periods = 個數,normalize = True,freq = '時間頻率' )
# normalize 正則化開關,去掉時分秒的時間 freq Q 季度 M 月 d 天 w 星期 nH 幾個小時 預設時間頻
# p = pd.Period(2010,freq = 時間頻率)
# 時期序列
# a = pd.period_range('開始時期','結束時期'/periods = 個數,freq = 'M')
# 時期轉換
# a.asfreq('M')