pandas的學習總結

pandas的學習總結html

 

做者:csj
更新時間:2017.12.31python

email:59888745@qq.com數組

說明:因內容較多,會不斷更新 xxx學習總結;數據結構

回主目錄:2017 年學習記錄和總結

1.pandas簡介
2.pandas數據結構
  Series
  DataFrame
  Index
  csv文件讀寫
3.經常使用函數:
  Group by
  Aggregate
  concat
  merge
  join
etcapp

-------------------------------------------------------------------------------------dom

 1.pandas簡介函數

  pandas是一個專門用於數據分析的python library。
  基於numpy (對ndarray的操做)
  至關於用python作Excel/SQL/R的感受;
2.pandas數據結構
  2.1Series:
     是一個一維的數據結構;默認用0到n來做爲Series的index,可是咱們也能夠本身指定index。
  index咱們能夠把它理解爲dict裏面的key;
  s=pd.Series([1,'a',2,'b',2,20])
  s2=pd.Series([1,'a',2,'b',2,20],index=[1,2,3,4,5)
  s4=pd.Series([{'a':1,'b':2},name='price'])
  print(s)
  s3=s.append(s2)
  Series就像一個dict,前面定義的index就是用來選擇數據的;
  Series的元素能夠被賦值;s1[0]=3
  數學運算;s1 + s2,s4 /2,s4 **2, r = 'a' in s4
  s4.median()中位數
  s4.mean()
  s4.max()
  s4.min();s4[s4 >s4.mean()]
  數據缺失:
  使用notnull和isnull兩個函數來判空:s4.isnull(),s4.notnull()
  爲空的部分,賦上平均值:s4[s4.isnull()]=s4.mean()
  選擇數據:s[1],s1[2,3,1],s1[1:],s1[:-1],s1.get('1'),s1[s1 <2],s1[s1.index !=2]

    2.2 DataFrame:
  一個Dataframe就是一張表格,Series表示的是一維數組,Dataframe則是一個二維數組;
  columns的名字和順序能夠指定;
  能夠從幾個Series構建一個DataFrame;
  能夠用一個list of dicts來構建DataFrame;
  data ={'a':[1,2,3],'b':[4,5,6]}
  pd1 = pd.DataFrame(data)
  df = pd.DataFrame(data,coulums=['t','f'],index=['one','tow','three']) #在DataFrame中columns對應的是列,index對應的是行。
  DataFrame元素賦值:
  能夠給一整列賦值:df["t"]=400
  給一整行賦值:df["one"]=100
  可使用loc,iloc選擇一行:
  pd1.loc['one'];pd1.iloc['one'];pd1[1:2]
  pd1中加入df:pd1.append(df2);pd1.append(series1)
  pd1中加入一column:pd1['newcol']=200
  df1["t"].loc["one"] = 300
  df1["colname"]='newcolumn'
  df1.columns
  df1.index
  df1.info
  df.index.name = "city"
  df.columns.name = "info"
  使用isin判斷價格在[]範圍內的:df1["one"].isin([30, 200])
  df1.where(df1["neo"] > 10)
  對於NAN會被上一個記錄的值填充上:df1.fillna(method="ffill") df.ffill()
  df.sub((row, axis=1)) 計算其餘的數據與row之間的差值
    2.3Index:
  Series時聲明index
  針對index進行索引和切片
  DataFrame進行Indexing與Series基本相同:df.loc[row,colu]
     2.4reindex:
  對一個Series或者DataFrame按照新的index順序進行重排;
  用drop來刪除Series和DataFrame中的index
post

  2.5csv文件讀寫:
    read_csv
    to_csv
3.經常使用函數:
    Group by
    Aggregate
    concat
    merge
    join

學習

 demo數據清洗:

分析數據問題

  1. 沒有列頭
  2. 一個列有多個參數
  3. 列數據的單位不統一
  4. 缺失值
  5. 空行
  6. 重複數據
  7. ASCII 字符
  8. 有些列頭應該是數據,而不該該是列名參數

1數據清洗 。檢查數據 查看一列的一些基本統計信息:data.columnname.describe() •選擇一列:data['columnname'] •選擇一列的前幾行數據:data['columnsname'][:n] •選擇多列:data[['column1','column2']] •Where 條件過濾:data[data['columnname'] > condition]優化

。處理缺失數據 。爲缺失數據賦值默認值 data.country.fillna('')#(0,mean) •去掉/刪除缺失數據行   data.dropna() data.dropna(how='all')刪除一整行的值都爲 NA   data.drop(thresh=5)刪除一整行數據中至少要有 5 個非空值 •去掉/刪除缺失率高的列

•添加默認值 data.country= data.country.fillna('')

•刪除不完整的行 data.drop(axis=0, how='any')

•刪除不完整的列 刪除一正列爲 NA 的列:data.drop(axis=1, how='all',inplace=True)行的例子中使用了 axis=0,由於若是咱們不傳

參數 axis,默認是axis=0 刪除任何包含空值的列:data.drop(axis=1, how='any',inplace=True)

•規範化數據類型 data = pd.read_csv('../data/moive_metadata.csv', dtype={'duration': int})

•必要的轉換 .錯別字 •英文單詞時大小寫的不統一:data['movie_title'].str.upper() •輸入了額外的空格:data['movie_title'].str.strip()

•重命名列名 data = data.rename(columns = {‘title_year’:’release_date’,

‘movie_facebook_likes’:’facebook_likes’})

•保存結果 data.to_csv(‘cleanfile.csv’ encoding=’utf-8’)

demo: df.head() .沒有列頭 # 增長列頭 column_names= ['id', 'name', 'age',

'weight','m0006','m0612','m1218','f0006','f0612','f1218'] df = pd.read_csv('../data/patient_heart_rate.csv', names = column_names)

.一個列有多個參數值,分割成多列 df[['first_name','last_name']] = df['name'].str.split(expand=True) df.drop('name', axis=1, inplace=True)

.列數據的單位不統一 rows_with_lbs = df['weight'].str.contains('lbs').fillna(False) df[rows_with_lbs] for i,lbs_row in df[rows_with_lbs].iterrows(): weight = int(float(lbs_row['weight'][:-3])/2.2) df.at[i,'weight'] = '{}kgs'.format(weight)

.缺失值 data.country.fillna('') •刪:刪除數據缺失的記錄(數據清洗- Pandas 清洗「髒」數據(一)/[數據清洗]-Pandas 清洗「髒」數據

(一)) •贗品:使用合法的初始值替換,數值類型可使用 0,字符串可使用空字符串「」 •均值:使用當前列的均值 •高頻:使用當前列出現頻率最高的數據 •源頭優化:若是可以和數據收集團隊進行溝通,就共同排查問題,尋找解決方案。

.空行 # 刪除全空的行 df.dropna(how='all',inplace=True) df.dropna(how='any',inplace=True) .重複數據 # 刪除重複數據行 df.drop_duplicates(['first_name','last_name'],inplace=True)

.非 ASCII 字符 處理非 ASCII 數據方式有多種 •刪除 •替換 •僅僅提示一下

咱們使用刪除的方式:

# 刪除非 ASCII 字符 df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True) df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

.有些列頭應該是數據,而不該該是列名參數,將多列合併爲一列 # 刪除沒有心率的數據 row_with_dashes = df['puls_rate'].str.contains('-').fillna(False) df.drop(df[row_with_dashes].index, inplace=True)

 

import pandas as pd
# 增長列頭
column_names= ['id', 'name', 'age', 'weight','m0006','m0612','m1218','f0006','f0612','f1218']
df = pd.read_csv('../data/patient_heart_rate.csv', names = column_names)

# 切分名字,刪除源數據列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

# 獲取 weight 數據列中單位爲 lbs 的數據
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
df[rows_with_lbs]

#get row data

df[1:5]

#get col data

df['columnsname']

#get row and col data

df['columnsname'][1:3
# 將 lbs 的數據轉換爲 kgs 數據
for i,lbs_row in df[rows_with_lbs].iterrows():
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)

# 刪除全空的行
df.dropna(how='all',inplace=True)

# 刪除重複數據行
df.drop_duplicates(['first_name','last_name'],inplace=True)

# 刪除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

# 切分 sex_hour 列爲 sex 列和 hour 列
sorted_columns = ['id','age','weight','first_name','last_name']
df = pd.melt(df,
id_vars=sorted_columns,var_name='sex_hour',value_name='puls_rate').sort_values(sorted_columns)
df[['sex','hour']] = df['sex_hour'].apply(lambda x:pd.Series(([x[:1],'{}-{}'.format(x[1:3],x[3:])])))[[0,1]]
df.drop('sex_hour', axis=1, inplace=True)

# 刪除沒有心率的數據
row_with_dashes = df['puls_rate'].str.contains('-').fillna(False)
df.drop(df[row_with_dashes].index,
inplace=True)

# 重置索引,不作也不要緊,主要是爲了看着美觀一點
df = df.reset_index(drop=True)
print(df)

 

------add 20180110 by 59888745@qq.com--------

# Demo 1  of pandas 
# bike project # stocks project # credit project import pandas as pd import numpy as np bikes = pd.read_csv('data/bikes.csv', sep=';', parse_dates=['Date'], encoding='latin1', dayfirst=True, index_col="Date") bikes.head() #bikes.dropna() #bikes.dropna(how='all').head() df0= bikes.dropna(axis = 1,how='all').head() bikes.shape #apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds) method of pandas.core.frame.DataFrame instance #apply這個函數能夠逐行的來處理內容。 #得到每列的有多少行是空的 #bikes.apply(lambda x:sum(x.isnull())) bikes.isnull().sum() #如何填充缺失的數據 # row =bikes.iloc[0].copy # bikes.fillna(row) # 獲得一列,這一列都是其餘行的平均數 m = bikes.mean(axis=1) #而後使用m去一行一行的填充bikes中數據爲NaN的 #bikes.iloc[:, i]表示bikes全部行的第i列。 for i, col in enumerate(bikes): bikes.iloc[:, i] = bikes.iloc[:, i].fillna(m) bikes.head() #計算berri_bikes週一到週日中天天分別的騎車的人數進行統計。而後畫個圖 berri_bkies=bikes['Berri 1'].copy() berri_bkies.head() # berri_bkies.index # l=berri_bkies.index.weekday # berri_bkies["weekday"]=l # weekday_counts = berri_bkies.groupby('weekday').aggregate(sum) # weekday_counts #weekday_counts = berri_bkies.groupby('weekday').aggregate(sum) #weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] #weekday_counts #berri_bkies.plot(kind="bar") # to_frame能夠把一個Series轉換成一個DataFrame #bikes.sum(axis=1)將天天中全部的線路加在一塊兒 #berri_bkies.sum(axis=1).to_frame().head() #Demo 2 # goog = pd.read_csv("data/GOOG.csv", index_col=0) # goog.index = pd.to_datetime(goog.index) # goog["Adj Close"].plot(grid = True) # goog.shift(1).head() #shift其實就是將日期數字日後移動了一天 # aapl = pd.read_csv("data/AAPL.csv", index_col=0) # aapl.index = pd.to_datetime(aapl.index) # #aapl.head() # aapl["Adj Close"].plot(grid=True) #Demo 3 # df = pd.read_csv("data/credit-data.csv") # df.head() # for i, val in enumerate(df): # print(val) # print(df[val].value_counts()) # df['income_bins'] = pd.cut(df.monthly_income, bins=15, labels=False) # pd.value_counts(df.income_bins) # df["monthly_income"] = df["monthly_income"].fillna(df["monthly_income"].mean()) # df["income_bins"] = df["income_bins"].astype("int") #pandas cont list # Series # #構造和初始化Series # s = pd.Series({"bj":100,"sz":200}) # s['bj'] # s2=pd.Series([1,2,3,4]) # s2[0] # s3=pd.Series(("1",2,3),index=[1,2,3]) # s4 = s3.append(s2,ignore_index=True) # s4 # s5 =s4.drop(1) # s5 # s6 =pd.Series(np.random.randn(5),index=['a','b','c','d','e']) # s6 # s7 = pd.Series(np.random.randn(5),index=range(6,11)) # s7 # #選擇Series數據 # #使用下標格式 # s7[6] # s7[[6,8]] # s7[:-1] # s7[1:-1] # #相加的時候能找到的相加,找不到的爲空 # s8 =s7[1:] + s7[:-1] # #可使用下標格式或者字典格式來找數據 # s['bj'] # s[['bj','sz']] # t = 'bj' in s # t # t2 =6 in s8 # t2 # t3 =s8.get(7) # t3 # t4 = s8[s8 <8] # t4 # s8[s8.index !=9]
#series的增刪改查 

tm=pd.Series({'hefei':1000}) tm2=pd.Series({'hefei2':2000}) tm3 = tm.append(tm2) tm4 =tm3.drop('hefei') 'hefei2' in tm4 tm4.get('hefei2') tm3['hefei2']=3000 tm3 tm3 / 2 tm3 **2 np.log(tm3) tm5 =tm3+tm2*2 tm5 tm5.isnull() tm6 =tm5[tm5.isnull()]=tm5.mean() tm6
 # DataFrame # data=['beijin',1000,'shenzhen',2000] # df=pd.DataFrame(data,columns=['city'],index=['a','b','c','d']) # df.loc['b'] # data2 = [{"a": 999999, "b": 50000, "c": 1000}, {"a": 99999, "b": 8000, "c": 200}] # data3 = [ "a",999999, "b", 50000, "c", 1000] # df2= pd.DataFrame(data2,index=['one','two'],columns=['a','b','c']) # #df2= pd.DataFrame(data3,index=['one','two','three','four','five','six'],columns=['a']) # df3 =df2.drop('c',axis=1) # df3 # df4 =df2.drop('one',axis=0) # df4 # #如何改變列的位置? # df5= pd.DataFrame(data2,index=['one','two'],columns=['a','c','b']) # df5 #df.dropna()會刪除全部帶NA的行 #df.dropna(how='all').head()刪掉所有都是NA的行 #df.dropna(how='any').head()刪掉部fen 都是NA的行 #若ignore_index=True因爲索引存在衝突因此會創建新的索引,若爲False,會存在索引相同的狀況 #df3 =df2.append(df_s,ignore_index=True) #若要三個Series 可以合併的比較好的一個DataFrame那麼它們的行index最好是同樣的。 # s_product=pd.Series([10.0,12.0,14.0],index=['apple','bear','banana']) # s_unit=pd.Series(['kg','kg','kg'],index=['apple','bear','banana']) # s_num=pd.Series([100,200,300],index=['apple','bear','banana']) # #df = pd.DataFrame({'prices':s_product,'unit':s_unit,'num':s_num},columns=['prices','unit','num'],index=['one','two','three']) # df = pd.DataFrame({'prices':s_product,'unit':s_unit,'num':s_num},columns=['num1','prices','unit']) # df # df2 = pd.DataFrame(s_product,columns=['prices']) # df2['num']=100 # s=['a','b','c'] # df_s=pd.DataFrame(s) # #若ignore_index=True因爲索引存在衝突因此會創建新的索引,若爲False,會存在索引相同的狀況 # df3 =df2.append(df_s,ignore_index=True) # df3 # df3[['prices','num']].loc['0':'1'] # df3 # df3['0']=200 # df3['prices'].loc[3:5]=15 # df3.prices=0 # df3.num=200 # df3.num.loc[0]=1 # df3 # df3.shape # df3.info # df3.describe() # df3.prices.value_counts() # in_prices=pd.Series([100,200,300],index=[0,1,2]) # df3.prices=in_prices # df3 # df3['remark']= df3.prices >100 # df3 # df_t=df3.T # df_t # ss=pd.Series({'prices':0,'num':0,'0':0,'0':0,'remark':0}) # df_t['hefei']=ss # df_t=df_t.T # df_t # df_t.loc['hefei2']=0 # #df_t.T # df_t.index.name='remark' # df_t.columns.name='city' # df_t # # df5 =df_t['prices'].isin([100,200]) # df_t.where(df_t['num'] ==200) # df_t['num'] ==200 # df_t.fillna(method='ffill') # df_t.ffill() #df_t.fillna(value=0) # Index #reindex() # csv文件讀寫 #goog = pd.read_csv("data/test.csv", index_col=0) pd.read_csv('data/bikes.csv', encoding='latin1') #bikes = pd.read_csv('data/bikes.csv', sep=';', parse_dates=['Date'], encoding='latin1', dayfirst=True, index_col='Date') # encoding='latin1':文件解析的時候默認是有utf-8來解析的,因此有時候會出錯,要改爲'latin1';dayfirst=True表示的是Date排列的時候是按順序的, # index_col='Date' 將Date做爲index #df.to_csv("data/test2.tsv", sep="\t") # date # d1=pd.date_range('20180102',periods=5)#5 is row num # s=np.random.randn(5,4)#5 is row num # df1=pd.DataFrame(s,index=d1,columns=list('abcd'))#columns的名字和順序能夠指定 # Group by #df_grb = df.groupby('name') #df_grb.sum() df_grb.var() df_grb.mean() df_grb.describe() # Aggregate #weekday_counts = berri_bkies.groupby('weekday').aggregate(sum) # concat #df.concat([df1,df2,df3],axis=1) #df.append(df1) #df.append([df1,df2]) # merge #df.merge(df0,df1,on='cities') #df.merge(df0,df1,on='cities',how='outer') how:left,right,outer # join #df.join(df0, lsuffix=" goog", rsuffix=" aapl") #apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds) method of pandas.core.frame.DataFrame instance #apply這個函數能夠逐行的來處理內容。 #得到每列的有多少行是空的 #df.apply(lambda x: sum(x.isnull())) #df.isnull().sum() #如何填充缺失的數據 #row = df.iloc[0].copy() #row.fillna(row.mean()) # 獲得一列,這一列都是其餘行的平均數 # m = bikes.mean(axis=1) # #而後使用m去一行一行的填充bikes中數據爲NaN的 # #bikes.iloc[:, i]表示bikes全部行的第i列。 # for i, col in enumerate(bikes): # bikes.iloc[:, i] = bikes.iloc[:, i].fillna(m) # bikes.head() bikes.apply(lambda x: sum(x.isnull())) import pandas as pd import numpy as np #若要三個Series 可以合併的比較好的一個DataFrame那麼它們的行index最好是同樣的。 df = pd.DataFrame({ 'Name': ['a1', 'b1', 'c1', 'd1', 'a1', 'b1', 'c1', 'd1'], 'Year': [2016,2016,2016,2016,2017,2017,2017,2017], 'Salary': [10000,2000,4000,5000,18000,25000,3000,4000], 'Bonus': [3000,1000,1000,1200,4000,2300,500,1000] }) #groupby df1= df.groupby('Name').sum() df1 
Out[61]:
Date
2012-01-01     35
2012-01-02     83
2012-01-03    135
2012-01-04    144
2012-01-05    197
Name: Berri 1, dtype: int64
In [ ]:
相關文章
相關標籤/搜索