pandas數據分析小知識點(一)

  最近工做上,小爬常常須要用python作一些關於excel數據分析的事情,顯然,從性能和拓展性的角度出發,使用pandas、numpy是比vba更好的選擇。由於pandas能提供諸如SQL的不少查找、過濾功能,性能要比用excel Vlookup之類的公式要快得多,暴力的多!html

萬事開頭難,咱們第一步就是要載入excel數據源到pandas的DataFrame中:python

技巧一:算法

當咱們的excel中只有某些字段是須要去處理的,這個時候,不建議一次性用read_excel載入默認的全部列,不然影響pandas的載入速度和後面的運算性能。好比:api

df = pd.read_excel("data.xlsx", usecols=[0, 5]) # 指定讀取第1列和第6列 # 固然也能夠用"A,F"代替[0,5]

#若是咱們要載入1-25列,上面的列表依次列舉的寫法就比較笨了,能夠考慮這樣寫
df = pd.read_excel("data.xlsx", usecols=list(range(25) ))

實際上,read_excel的參數有不少,具體以下(詳見:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html):app

pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=False, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, keep_default_na=True, verbose=False, parse_dates=False, date_parser=None, thousands=None, comment=None, skip_footer=0, skipfooter=0, convert_float=True, mangle_dupe_cols=True, **kwds)

這裏面還有一個參數很重要,咱們讀入的excel通常都有表頭,可是表頭不必定是在第一行,也就是咱們要指定header=0的具體值,好比咱們告訴panda 這個excel的表頭在第五行,從第六行開始纔是數據行,咱們只須要指定header=4 便可。函數

 

技巧二:性能

咱們在作dataFrame處理時,程序常常由於copy報警,好比咱們根據某一個字段運算後生成新的字段,或者經過某種算法 對本字段的內容進行更新,都會觸發以下報警:spa

SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copyexcel

假設咱們的運算比較複雜,不能簡單用提示的 A.loc[3,4]=5這種,就很難避免這類報警,好比:code

data.loc[data.bidder == 'parakeet2004', 'bidderrate'] = 100
若是您能篤定該操做不會影響原DataFrame,能夠考慮用下面的代碼關掉報警(謹慎使用):
pd.set_option('mode.chained_assignment', None)
技巧三:
  善於用dropna方法來過濾數據!該方法支持傳入列表,對列表元素對應的每一個字段同時使用dropna方法:
df=df.dropna(subset=["供應商代碼(必填)",'供應商名稱(必填)','本月計劃支付金額(必填)',"款項性質(必填)","付款條件(必填)"])
 

技巧四:

善於使用map、apply方法來遍歷元素結合自定義函數,好比小爬要處理的字段:先要判斷該字段對應的元素是否爲數字,要過濾掉那些不是數字的行,就能夠先定義函數,而後用apply或者map來調用它:

def isNumber(x):
    if isinstance(x,float) or isinstance(x,int):
        return 1
    if isinstance(x,str):
        return 0

df["本月計劃支付金額爲數字"]=df["本月計劃支付金額(必填)"].map(isNumber) #產生輔助字段
df=df[df["本月計劃支付金額爲數字"]==1]
df=df[df['本月計劃支付金額(必填)']>0]

技巧五:

  判斷某個字段的值是否在某個列表,經常使用.isin(list)方法,好比:

error_df=original_df[original_df["供應商代碼(必填)"].isin(common_supplier_list_final)]  #common_supplier_list_final爲列表對象

若是咱們但願取反,找不符合某個列表元素的那些數據集合,就要用到「~」,上面的語句能夠改寫爲:

error_df=original_df[~original_df["供應商代碼(必填)"].isin(common_supplier_list_final)] #對正常那部分行項目拋開,取反,關鍵符號~

技巧六:

擅於使用lambda表達式,尤爲是功能很簡單的函數,不必單獨自定義,好比,對某個字段的每一個值都乘以10000,或者對某字段元素的全部字符串加上前綴「0000」,能夠這樣寫:

result_df["承兌匯票金額"]=result_df["承兌匯票金額"].apply(lambda x:x*10000)
result_df["供應商代碼(必填)"]=result_df["供應商代碼(必填)"].map(lambda x:"0000"+x if len(x)==6 else x) 

result_df["供應商代碼"]=result_df["供應商代碼"].map(lambda x:x[4:])  #去掉供應商代碼的前0000

技巧七:

利用drop_duplicates方法去重,有的時候,咱們根據幾個字段對應的某行值同時相同時,判斷這些行是重複的,僅保留第一行,能夠這樣寫:

result_df=result_df.drop_duplicates(['公司代碼','供應商代碼','供應商名稱','本月計劃支付金額'],keep='first') #去重

 

 

  小爬深知,咱們在實際的數據分析過程當中,用戶提供的數據源每每有不少髒數據,不少空數據,咱們作數據處理前先要學會作數據清洗,這就須要用到pandas的不少方法和小知識,惟有逐漸積累,才能慢慢熟悉,爲我所用!
相關文章
相關標籤/搜索