1. 程式人生 > 其它 >pandas:資料迭代、函式應用

pandas:資料迭代、函式應用

1、資料迭代

1.1 迭代行

(1)df.iterrows()

  for index, row in df[0:5].iterrows():  #需要兩個變數承接資料
      print(row)
      print("\n")
  for index, row in df[0:5].iterrows():
      print(row.team)  #通過物件屬性方式
      print(row['name']) #通過字典方式讀取具體列
      print("\n")

(2)df.iertuples()


  #生成一個nametuples型別的資料,預設name為Pandas(可在引數中指定)


  for row in df[0:5].itertuples():
      print(row,"\n")
  for row in df[0:5].itertuples():
      print(row.name,"\n") #可以通過元素屬性的方式取出具體值

1.2 迭代列

(1)df.iteritems()、df.items()

  # df.items(),df.iteritems() 迭代時返回(列名,本列的series結構資料)

  for label, item in df[0:5].items():  #label是列名
      print(label,item)
      print("\n")
  for label, item in df[0:5].items():
      print(item) #item的資料結構是series(有行索引,和資料)
      print("\n")
  for label, colunm in df[0:5].items():
      print(colunm.sort_values()) #資料結構是series(有行索引,和資料)因此可以使用series的方法
      print("\n")

(2)對dataframe直接進行迭代

  for item in df:
      print(item) #item會得到df的列名
      print("\n")
  for item in df:
      print(df[item]) #item會得到df的列名,通過df[item]又可以得到每個列的值
      print("\n")

2、函式應用

2.1 pipe()

  #將複雜的呼叫簡化,語法結構為df.pipe(<函式名>,<引數列表或字典>)
  #ta將dataframe或series作為函式的第一個引數

  #定義一個函式,給所有季度的成績加n,然後增加一個平均數

  def add_mean(df,n):
      n_df = df.copy()
      n_df = n_df.loc[:,'Q1':'Q4'] + n
      n_df['avg'] = n_df.sum(1)
      
      return n_df
      
  add_mean(df,100) #此時原本的df沒變
  df.pipe(add_mean,100) #執行結果與上圖一致

  #函式部分還可以使用lambda

  df.pipe(lambda df,x,y: df[(df.Q1>x) & (df.Q2 >y)],60,70)  #選出df中同時滿足Q1>60,Q2>70的資料

2.2 apply()

  #apply(),對df按行和列(預設逐列傳入)進行函式處理,也支援series(傳入具體值)


  #將name轉換為全小寫
  df.name.apply(lambda x : x.lower())
  #計算每個季度的平均成績,計算方法為去掉一個最高分和去掉一個最低分

  def avg(s ):
      min = s.min()
      max = s.max()
      average = (s.sum()-min-max)/ (s.count()-2)
      return average
      
  df.select_dtypes(include='number').apply(avg)
  #計算每個學生的平均成績

  df1 = df.set_index('name')
  df1.select_dtypes(include='number').apply(avg)
  #與np.where()配合使用 np.where(邏輯表示式,替換值1,替換值2)

  df.apply(lambda x: (x.team=='A') & (x.Q1>90), axis=1).map({True:'GOOD',False:'Other'})

2.3 applymap()

  #applymap(),對dataframe或者series的所有元素(不包括索引)應用函式處理

  #使用lambda時,變數是指具體的值

  #例子:計算每個資料的長度

  df.applymap(lambda x:len(str(x)))

2.4 map()

  #map()根據輸入對應關係對映值返回最終資料

  #可傳入一個人字典(鍵為原值,值為新值)
  #可傳入一個函式(引數為series的每個值)


  df.team.map({'A':'一班','B':'二班','C':'三班','D':'四班'}) #沒有對映值的會被填為NAN
  df.team.map('I am a {}'.format)  #傳入格式化表示式來格式化資料內容
  df.Q1.map('11{}'.format) #數字會被轉為字元

2.5 agg()

  #agg使用指定軸上的一項或多項操作進行彙總
  #可以傳入一個函式揮著函式的字元

  #每列的最大值
  df.agg('max')
  #將所有列聚合產生sum和min兩行
  #傳入多個函式

  df.agg(['sum','min'])
  #序列多個聚合
  df.agg({'Q1':['sum','min'],'Q2':['sum','max']})
  #分組後聚合

  df.groupby('team').agg('max')
  #支援每個列分別用不同的方法聚合
  #支援指定軸的方向

  #1、不同列使用不同的方法進行聚合

  df.agg(最大值=('Q1',max),
        最小值=('Q2',min),
        平均值=('Q3',np.mean),
        求和=('Q4',lambda x :x.sum())
        )
  #2、按行聚合
  df.loc[:,'Q1':'Q4'].agg(np.mean,axis=1)

2.6 transform()

  #datafram或者series自身呼叫函式,並返回一個與自身長度相同的資料

  #1、應用匿名函式
  df.transform(lambda x:x*2)  #字串會變成重複兩遍,數字會*2
  #呼叫多個函式

  df.transform([np.sqrt,np.exp]) #自動篩選數字列,並應用

3、參考文獻

《深入淺出Pandas》