做數據分析的同學大部分入門都是從excel開始的,excel也是微軟office系列評價最高的一種工具。
但當數據量超過百萬行的時候,excel就無能無力了,python第三方包pandas極大的擴展excel的功能,入門需要花費一點時間,但是真的是做大數據的必備神器!
1.從文件讀數據
pandas支持多種格式數據的讀取,當然最常見的是excel文件、csv文件和TXT文件。
names指定列名,delimiter指定列之間的分隔符
文件名前最好加‘r’,代表不轉義。
import numpy as np import pandas as pd
#讀取TXT文件 df=pd.read_table('C:\Users\wangbin10\Desktop\jhinfo.txt',names=['dvid','cid','dt','atimes'],delimiter='\t') #讀取excel文件 df=pd.read_excel(r'E:\log\token0722.xlsx','Sheet1') #讀取csv文件 df=pd.read_csv(r'E:\log\channel_add\channel_add11.txt',names=['cha','dvid','dt','act','isna'],delimiter='\001')
2.向文件寫數據
當我們通過各種透視、鑽取、轉換得到我們需要的數據,就可以保存到文件中。
groupd=df.groupby('cid')['atimes'] #保存到csv文件,保留index groupd.mean().to_csv('E:\log\channel_add\group10.csv',index=True) #輸出到excel文件 df3=pd.to_excel(r'E:\log\token0722v1.xlsx') #保存到csv文件,不保留index df.to_csv('E:\log\lost.txt',index=False)
def save_excel(dst_file, sheet_data_list, sheet_name_list): writer = pd.ExcelWriter(dst_file, engine='xlsxwriter') for sheet_data, sheet_name in zip(sheet_data_list, sheet_name_list): sheet_data.to_excel(writer, sheet_name=sheet_name, index=False, encoding='utf8') writer.save() writer.close()
3.數據的篩選
往往我們並不需要文件中的所有數據,只是需要其中的一部分,pandas提供了很多方式把它切出來
#邏輯篩選 df2=df[df['cid'].isin(['c147','c148'])] df2=df[df['atimes']>1] df2=df[df['is_new']=='T'] #選取index=A 的數據 df['A'] #選擇前三行 df[0:3] #按位置對行列進行選擇 df.iloc[3:5,1:2] df.iloc[[1,2,5],[0,2] df.iat[1,1] #按標簽篩選 df.loc['20160101':'20160131',['dt','atimes']] # 復雜篩選 data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not Graduate") & (data["Loan_Status"]=="Y"), ["Gender","Education","Loan_Status"]]
4.數據排序
# 按行序號或列序號進行排序 df.sort_index(axis=1,ascending=false) # 按值排序 df.sort(columns='dt') data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'], ascending=False)
5.數據轉換
# 強制類型轉換 data[row['feature']]=data[row['feature']].astype(np.float) #賦值 df.at[dates[0],'A'] = 0 df.iat[0,1] = 0 # 對列去重 df.drop_duplicates() # 刪掉任意有缺省值的行 df1.dropna(how='any') # 填充缺失值 df1.fillna(value=5) # 將一行增加到df df.append() # 轉換數據結構,將數據改變成記錄式 stacked = df2.stack() # 將記錄數據改成行列式 stacked.unstack() # 賦值 df.ix[1:3,['B','C']] = 1.0 f=lambda x:x[:7] # 新增一列月份 df['month']=df['dt'].apply(f) # 新增一列客戶端 df['platform']=np.where(df['dvid'].str.len()>=32,'IOS','Android') # 刪掉某一行,按照index,默認是在行上刪除,刪除列需要指定軸 df.drop(index) df.drop('dvid',axis=1) # 利用where進行生成新字段 os=np.where(df['dt'].str.startswith('2016-05'),'2016-05','2016-06') # 截取不需要的字符串 df['act2']=df['act1'].str.rstrip('_ios') #利用numpy進行數據轉換 df['news']=np.where(df['_c1'].str.find('\"news\"')==-1,'F','T') # 字符串分割轉換為列表,並使用函數生成新列 df2['act']=df2['act'].str.split(',') df2['actimes']=df2['act'].apply(date_change) # 替換hive特殊符號 df['act']=df['act'].str.replace('\002',',')
6.數據概覽
df.head()
df.tail()
df.index
df.columns
df.values
df.describe()
7.數據連接合並
# 求兩個數據的交集 df=pd.merge(df1,df2,on ='dvid') # 按列合並數據集 pd.merge() df4=pd.merge(df2,df3,left_on=['dvid'],right_on=['divice_id'],how='left') # 按行鏈接各部分組成新的dataframe dfs1=pd.concat([df1,df2,df3,df4,df5])
8.數據聚合
對列atimes按照cid進行聚合,求均值 groupd=df.groupby('cid')['atimes'] groupd.mean() # 按月份和cid進行分組,計算均值 groupd=df['atimes'].groupby([df['month'],df['cid']]) # groupby 的其他方式,.count(),sum(),prod(),mean(),min(),max(),std(),var(),first(),last(),describe()也可以自定義函數 # 若要觀察多個指標,可使用agg傳入 groupd.agg(['sum','count','mean']) # 也可以通過元組方式對不同字段進行不同方式聚合 groupd.agg([('dvid','sum'),('atimes','count')]) # 若對多個列進行多種方式聚合,可以使用下列方式 functions=['sum','count','mean'] groupd['dt','cid'].agg(functions) # 調用value_counts函數可以方便對任意列進行計數統計,默認按照降序排列 tz_counts=df['cid'].value_counts()
9.數據透視表
數據透視表是excel的重要功能,pandas也提供了透視表功能。
# 數據透視表 pv_table=pd.pivot_table(df,index=['cid'],columns=['month'],values=['atimes'],aggfunc=[np.mean]) # 交叉表 cross_table=pd.crosstab(df['cid'],df['month'])
10.單列數據的運算
單列數據可以進行簡單的sum(),count(),mean(),max(),min()等運算。
df['num'].sum() df['num'].count() df['num'].mean() df['num'].max() df['num'].min()
11.apply
def table_name_merge(data_frame, db2, table2): db_name = data_frame[db2] table_name = data_frame[table2] ... df['table_name_2'] = df.apply(table_name_merge,axis=1, args=('db', 'table'))
12.row_num
df26['row_num'] = df26['交易金額2'].groupby(df26['供應商id']).rank(ascending='desc', method='first')
13.collect_set
data2 = df.groupby('url', as_index=False)['type'].agg(lambda x: x.str.cat(sep=','))