python-數據分析-(11)pandas聚合函數、透視表、交叉表、表格合並常見操作


一 聚合函數

1. numpy、pandas使用的統計方式
    在數組中經常使用的聚合方式
  data[['counts', 'ches_name']].agg([np.mean, np.std])
  agg({'xx':np.mean, 'xx2':[np.sum, np.std]})
2. 在pandas或者numpy中沒有現成的函數可以使用,可以使用transform自定義函數

如: 將指定列的全部數據 * 2

    方式一
  data['counts'].transform(lambda x: x*2)
    方式二:按照函數內既定的規則,進行指定數據的操作
  def transform_func(values):
  """自定義函數,定義數據操作規則"""
  return values*2
  data['counts'].transform(transform_func)   # 一維
  data1 = data.groupby(by='品牌')['銷售額'].transform(tran_func) # 分組之后自定義聚合

二 透視表 - pivot_table

    源碼參數分析
  def pivot_table(
      data,             # Dataframe,對哪張表進行操作
      values=None,     # 顯示的字段
      index=None,       # 行分組鍵,可以是數組,列表,如果是數組,必須有一樣的長度
      columns=None,     # 列分組鍵
      aggfunc="mean",   # 聚合函數, 默認是mean
      fill_value=None,   # 填充空值, 將為Nan的值填充為對應的值
      margins=False,     # 匯總開關,默認是False
      dropna=True,
      margins_name="All", # 匯總的列或者行的bolumns,可以指定修改名稱
      observed=False,
1、index: 行分組鍵,分完組后,分組鍵的取值在行索引的位置上
    pd.pivot_table(data, index=['order_id', 'dishes_name'], aggfunc=[np.mean, np.sum], values=['add_inprice', 'counts'])
                                  mean               sum      
                            add_inprice counts add_inprice counts
  order_id dishes_name                                          
  137     農夫山泉NFC果汁100%           0     1           0     1
            涼拌菠菜                     0     1           0     1
            番茄燉牛腩\r\n                 0     1           0     1
            白飯/小碗                     0     4           0     4
            西瓜胡蘿卜沙拉                   0     1           0     1
  ...                             ...   ...         ...   ...
  1323     番茄燉秋葵                     0     1           0     1
            芝士燴波士頓龍蝦                 0     1           0     1
            芹黃鱔絲                     0     1           0     1
            蒜蓉生蚝                     0     1           0     1
            谷稻小庄                     0     1           0     1
  [2778 rows x 4 columns]

2、columns: 列分組鍵,分完組后,分組鍵的取值在列索引上

    pd.pivot_table(data, columns= ['order_id', 'amounts'], aggfunc=[np.mean, np.sum], values=['add_inprice', 'counts'])
  # 列分組鍵,可以說是行分組鍵的轉置
              mean                               ... sum                        
  order_id   137                           165   ... 1323                        
  amounts     1   6   26   27   35   99   9   ... 39 49 58 65 78 80 175
  add_inprice 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ...   0   0   0   0   0   0   0
  counts       4.0 1.0 1.0 1.0 1.0 1.0 1.5 ...   1   1   1   1   1   1   1
  [2 rows x 4956 columns]
3、結合使用
    # aggfunc 聚合函數
  # fill_value 為空的,怎么顯示,默認為Nan
  # margins 匯總,默認是不匯總
  # margins_name 匯總列或者行字段名稱,默認為all
  pd.pivot_table(data, index=['dishes_name'], columns='order_id', values='counts', aggfunc=np.sum, fill_value=0, margins=True, margins_name='總')
  dishes_name   42度海之藍   北冰洋汽水   38度劍南春   50度古井貢酒 ... 黃油曲奇餅干 黃花菜炒木耳 黑米戀上葡萄     總
  order_id                                         ...                              
  137               0       0       0       0 ...       0       0       0     9
  165               0       0       1       0 ...       0       1       0   21
  166               0       0       0       0 ...       0       0       0     7
  171               0       0       0       0 ...       0       0       0   10
  177               0       0       0       0 ...       0       0       0     4
  ...             ...     ...     ...     ... ...     ...     ...     ...   ...
  1314               0       0       1       0 ...       0       0       0   12
  1317               0       0       0       0 ...       0       0       0   18
  1319               0       0       0       0 ...       0       0       0     9
  1323               0       0       1       0 ...       0       0       0   15
  總                 5       45       6       5 ...       5     15     18 3088

三 交叉表-crosstab

    def crosstab(
      index,   # 行分組鍵
      columns, # 列分組鍵
      values=None,   # 顯示的字段
      rownames=None,   # 行name
      colnames=None,     # 列name
      aggfunc=None,     # 聚合函數
      margins=False,     # 匯總
      margins_name: str = "All",   # 匯總列或者行的名稱
      dropna: bool = True,
      normalize=False,
基本語法
    pd.crosstab(index = data['dishes_name'], columns=data['order_id'], values=data['counts'], aggfunc = np.sum)
    dishes_name   42度海之藍   北冰洋汽水   38度劍南春   ...  黃油曲奇餅干  黃花菜炒木耳  黑米戀上葡萄
    order_id                                ...                        
    137              NaN      NaN      NaN  ...     NaN     NaN     NaN
    165              NaN      NaN      1.0  ...     NaN     1.0     NaN
    166              NaN      NaN      NaN  ...     NaN     NaN     NaN
    171              NaN      NaN      NaN  ...     NaN     NaN     NaN
    177              NaN      NaN      NaN  ...     NaN     NaN     NaN
    ...              ...      ...      ...  ...     ...     ...     ...
    1309             NaN      NaN      NaN  ...     NaN     NaN     NaN
    1314             NaN      NaN      1.0  ...     NaN     NaN     NaN
    1317             NaN      NaN      NaN  ...     NaN     NaN     NaN
    1319             NaN      NaN      NaN  ...     NaN     NaN     NaN
    1323             NaN      NaN      1.0  ...     NaN     NaN     NaN
    [278 rows x 156 columns]

四 表格合並

1、每個表的列都相同,pd.concat((df1, df2, df3 … ))

axis = 0 : 縱向合並 axis = 1:橫向合並,索引對應合並

    函數源碼
    def concat(
        objs: Union[Iterable["NDFrame"], Mapping[Label, "NDFrame"]], # 傳入的是Df格式
        axis=0,          # 進行合並的方向
        join="outer",    # 默認使用的外連接
        ignore_index: bool = False,  # 重置排序索引
        keys=None,
        levels=None,
        names=None,
        verify_integrity: bool = False,
        sort: bool = False,
        copy: bool = True,
    left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K3'],
                         'key2': ['K0', 'K1', 'K0', 'K1'],
                             'A': ['A0', 'A1', 'A2', 'A3'],
                            'B': ['B0', 'B1', 'B2', 'B3']})
    
    right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                             'C': ['C0', 'C1', 'C2', 'C3'],
                             'D': ['D0', 'D1', 'D2', 'D3']})
    pd.concat((left, right), axis = 0, join = 'inner')  # 指定使用內連接,進行合並,默認使用的是outer
    pd.concat((left, right), axis = 1, join = 'inner')  

2、 表合並,解決行索引沒有意義情況下,數據行不匹配問題(解決concat橫向拼接問題)

    def merge(
        left,                # 左表
        right,               # 右表
        how: str = "inner",    # 默認是內連接,
        on=None,               # 必須是兩張表中有公共的主鍵,才能作為主鍵
        left_on=None,          # 左表主鍵
        right_on=None,         # 右表主鍵
        left_index: bool = False,
        right_index: bool = False,
        sort: bool = False,
        suffixes=("_x", "_y"),
        copy: bool = True,
        indicator: bool = False,
        validate=None,

(1) 兩表中有相同的主鍵

    on 連接的主鍵,兩表中共有的主鍵
    how 連接的方式,默認使用的是內連接
    outer外連接,返回全部     inner內連接返回等值連接     left以左表為主     right以右表為主
    pd.merge(left, right, on='key1', how='outer')
      key1 key2_x    A    B key2_y    C    D
    0   K0     K0   A0   B0     K0   C0   D0
    1   K0     K1   A1   B1     K0   C0   D0
    2   K1     K0   A2   B2     K0   C1   D1
    3   K1     K0   A2   B2     K0   C2   D2
    4   K3     K1   A3   B3    NaN  NaN  NaN
    5   K2    NaN  NaN  NaN     K0   C3   D3
    多個相同主鍵連接
    pd.merge(left, right, on=['key1', 'key2'], how='outer')
      key1 key2    A    B    C    D
    0   K0   K0   A0   B0   C0   D0
    1   K0   K1   A1   B1  NaN  NaN
    2   K1   K0   A2   B2   C1   D1
    3   K1   K0   A2   B2   C2   D2
    4   K3   K1   A3   B3  NaN  NaN
    5   K2   K0  NaN  NaN   C3   D3

(2) 兩表中沒有相同的主鍵

    left_on   : 指定左表中的主鍵
    right_on  : 指定右表中的主鍵
    pd.merge(left, right, left_on = 'key1', right_on = 'key2', how='outer')
      key1_x key2_x   A   B key1_y key2_y    C    D
    0     K0     K0  A0  B0     K0     K0   C0   D0
    1     K0     K0  A0  B0     K1     K0   C1   D1
    2     K0     K0  A0  B0     K1     K0   C2   D2
    3     K0     K0  A0  B0     K2     K0   C3   D3
    4     K0     K1  A1  B1     K0     K0   C0   D0
    5     K0     K1  A1  B1     K1     K0   C1   D1
    6     K0     K1  A1  B1     K1     K0   C2   D2
    7     K0     K1  A1  B1     K2     K0   C3   D3
    8     K1     K0  A2  B2    NaN    NaN  NaN  NaN
    9     K3     K1  A3  B3    NaN    NaN  NaN  NaN

(3) 更改表格名稱的方法

    left.rename(columns={'key1': 'key11111'}, inplace=True)
    print(left)
      key11111 key2   A   B

(4) 重疊合並,目的是將殘缺的表,合並為完整的表df1.combine_first(df2)

    主表.combine_first(附表)
    dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
      'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}
    
    dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
    'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}
    df1 = pd.DataFrame(dict1)
    df2 = pd.DataFrame(dict2)
    print(df1,df2)
    # 誰在前,為主表,主表中沒有的補全,有的值,不動
    print(df1.combine_first(df2))
       ID System
    0   1    W10
    1   2    w10
    2   3     w7
    3   4    w10
    4   5     w7
    5   6     w7
    6   7     w7
    7   8     w7
    8   9     w8

 


免責聲明!

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



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