天天看點

機器學習之Pandas 基礎2Pandas 基礎知識2

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

繼續閱讀