pandas dataframe資料處理
前言
2020年10月有幸進入了大資料這邊學著做專案,即筆者在資料挖掘領域的起點,從此開始了漫長的資料處理以及機器學習的專案實戰,為了方便隊友以及朋友們的數學建模知識儲備,將此程序中所學所用整理于此(部分為實戰代碼)
pandas----yyds
資料的讀取與寫入
一般我們的資料集的存盤形式為excel、csv,
讀取
######讀取一個csv檔案,得到一個dataframe
# 在服務器上的home目錄下讀取(服務器的jupyter notebook上操作)
bad_data = pd.read_csv('/home/huangpeng/shutdown_mobile_phone.csv')
# 在本地機器上讀取(本地的jupyter notebook)
data = pd.read_csv(r'C:\\Users\\Haotong Sun\\Desktop\\HP\\Project\\result\\result\\....csv',engine='python')
# 上面路徑前的'r'是為了防止\t的轉義,保留字符原始值,不加r有可能會報錯~
######批量讀取csv檔案,得到相應數量的dataframe,并且將其合并為一個dataframe(服務器與本地的代碼相同,修改路徑即可)
import re
# 1、設定路徑和檔案名
path = '/home/huangpeng/new_computed_feature_csv/'
files = os.listdir(path)
files_csv = list(filter(lambda x: x[-4:]=='.csv',files)) # 正則篩選檔案名后四位為'.csv'的檔案
num_filter = re.compile(r'\d+')
data_list = []
# 2、批量讀取csv檔案并轉成若干dataframe組成的串列(data_list)
for file in files_csv:
# 將每個csv轉成一個pd.dataframe
tmp = pd.read_csv(path + file)
# 設定pandas的dataframe的columns(列索引)
columns = ["n","call","called","avg","short" \
,"long","user","ring","call_die","max"]
tmp.columns = columns
# 把每個pd.dataframe放入一個串列中
data_list.append(tmp)
# 3、合并若干個dataframe,得到具有全量資料的dataframe
pd_all_df = pd.concat(data_list)
寫入
# 在本地機器上寫入一個csv檔案
df.to_csv(path_or_buf='C:\\Users\\Haotong Sun\\Desktop\\HP\\Project\\result\\temp.csv')
# 在本地機器上寫入一個excel檔案
df.to_excel('C:\\Users\\Haotong Sun\\Desktop\\HP\\Project\\result\\temp.xlsx')
pandas.dataframe的基本操作
對于dataframe的常用處理有創建、基本資訊獲取、行列讀取、插入、合并、以及兩個dataframe的互動處理等…
創建
data = {"number":['17345971216','18980452661','19981975787','18180945652','19162962272'],
'name':['11','22','33','44','55'],
'ares_code':['22','33','44','55','66']}
df = pd.DataFrame(data,index=['one','two','three','four','five'], \
columns=['number','name','ares_code'])
# dataframe.values回傳相應的numpy下的array物件
df.values
'''array([['17345971216', '11', '22'],
['18980452661', '22', '33'],
['19981975787', '33', '44'],
['18180945652', '44', '55'],
['19162962272', '55', '66']], dtype=object)'''
基本資訊獲取
# dataframe.index回傳行索引
df.index
'''Index(['one', 'two', 'three', 'four', 'five'], dtype='object')'''
# dataframe.columns回傳列索引
df.columns
'''Index(['number', 'name', 'ares_code'], dtype='object')'''
# dataframe.axes回傳行列索引
df.axes
'''[Index(['one', 'two', 'three', 'four', 'five'], dtype='object'),
Index(['number', 'name', 'ares_code'], dtype='object')]'''
# dataframe.info():列印df的資訊
df.info()
# dataframe.describe():按列進行描述性統計,生成一個描述性統計表格
df.describe()
# 顯示前n行或后n行資料
df.head(2)
df.tail(2)
按行列讀取
################按列讀取
######1、df.列索引 --》回傳Series物件
df.number
######2、df['列索引'] == df.列索引 --》回傳Series物件
df["number"]
df["number","name"]
######3、df.iloc[:,colNo] (colNo:0開始的列號) --》回傳dataframe物件
df.iloc[:,2]
df.iloc[:,0:2] # 取前三列
################按行讀取
######1、df.loc[['行索引']] --》回傳dataframe物件
df.loc[['one','two']]
######2、df.iloc[['行號']] --》回傳dataframe物件
df.iloc[[1]]
################獲取單元格
df['number']['one']
插入及合并
######在任意位置插入
# df.insert(loc, column, value) loc:插入的列號,column:列索引,value:列資料(串列)
df.insert(0,'number',['17680945652', '00', '88'])
''' call number name ares_code
one 1 17345971216 11 22
two 2 18980452661 22 33
three 3 19981975787 33 44
four 4 18180945652 44 55
five 5 19162962272 55 66'''
######添加新的一列到末尾
df["called"] = df["call"]
''' call number name ares_code called
one 1 17345971216 11 22 1
two 2 18980452661 22 33 2
three 3 19981975787 33 44 3
four 4 18180945652 44 55 4
five 5 19162962272 55 66 5'''
######按行列合并
# 按行合并
pd.concat([df,df1],axis=1)
# 按列合并
pd.concat([df,df2],axis=0)
df.append(df2)
在特征矩陣中做標記(label)(使用分類模型前的操作)
接下來的樣例處理的資料是原始特征矩陣資料,我們只想對其中在另一個資料集中出現的號碼進行分析,則需要做標記(在另一個資料集中出現的標為1,否則為0),那么我們該如何對這個dataframe增加一列label標記呢?
pd_all_df的每一行都是一個號碼的各個特征的dataframe,bad_data的numbers列提供了我們需要在pd_all_df中進行標記的號碼
# 1、將pd_all_df["number"]與bad_data["numbers"]中的資料進行匹配,若前者的元素在后者中出現,則標記為True,否則為False
pd_label_df = pd_all_df["number"].isin(bad_data["numbers"].values)
# 2、將Series轉為dataframe
pd_label_df = pd_label_df.to_frame()
# 3、將True轉為1,False轉為0
pd_label_df = pd_label_df["number"].apply(lambda x : 1 if x==True else 0)
# 4、在pd_all_df中添加一列,命名為"label",值為pd_label_df中的元素
pd_all_df["label"] = pd_label_df
# 5、從中抽取出label==1的號碼
pd_shutdown_df = pd_all_df.loc[pd_all_df["label"]==1]
# 重置行索引,恢復到0開始,步長為1
pd_shutdown_df = pd_shutdown_df.reset_index(drop=True)
特征的標準化/歸一化
min-max標準化:
將資料映射至-1到1區間內,以消除特征之間量綱不同的影響,
import numpy as np
def custom_max_min(x):
minn = np.min(x)
maxn = np.max(x)
return (x-minn)/(maxn-minn)
pd_delete_shutdown2["standard_calling_count"] = custom_max_min(pd_delete_shutdown2.calling_count.values)
pd_delete_shutdown2["standard_avg_call_time"] = custom_max_min(pd_delete_shutdown2.avg_call_time.values)
pd_delete_shutdown2["standard_max_talk_time"] = custom_max_min(pd_delete_shutdown2.max_talk_time.values)
Z-score標準化:
有些特征的最大值和最小值相距甚遠,若使用min-max標準化會導致大多數的值被映射的值過小,使該特征缺乏了表現力,
此時,如果這些特征近似滿足高斯分布,那么使用這種標準化是比較合理的,
import numpy as np
def custom_z_score(x):
meann=np.mean(x,axis=None)
delta=sum(abs(x-meann))/len(x)
return (x-meann)/delta
Z-score改進標準化:
對于本專案,有些特征并不近似滿足高斯分布,并且散度過大,平均值無法代表總體的特征,采用中位數能更好的表示總體特征,故我們將Z-score的均值修改為中位數,能達到更佳的效果,
import numpy as np
def custom_z_score(x):
median=np.median(x,axis=None)
delta=sum(abs(x-median))/len(x)
return (x-median)/delta
未完待續
接下來準備整理的內容是專案中的機器學習內容了,由于最近課內作業、期中考以及專案的推進,有空一定肝出來,敬請期待~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/208397.html
標籤:java
