python之數據分析pandas


做數據分析的同學大部分入門都是從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=','))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM