Python構文ベースのDataFrame

19394 ワード

Pythonデータ分析はまずデータ洗浄処理を行う必要があり、多くのDataFrameやSeriesに関する知識に関連している.ここでは、関連する一般的な方法を整理し、主にデータの増減、インデックスの変更、数値置換などを設計する.いくつかの関数のパラメータはそろっていませんが、pandasドキュメントを参照するか、エディタで入力する方法+?クエリー(df.reindexなど)、実践は知識レベルを検証する最良の道である.
ドキュメントディレクトリ:
  • インデックス
  • を変更
  • データ削除
  • 列全体
  • を削除
  • 行全体
  • を削除
  • 重複行削除
  • 欠落値を含む行/列削除
  • データ置換
  • 欠落値置換
  • その他の値置換
  • データインデックス
  • ラベルインデックスloc
  • 位置インデックスiloc
  • 論理選択
  • により
  • データソート
  • import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'name':['James','Curry','James','Kobe','Wade'],
                       'age':[31,30,31,35,38],
                       'score':[18,25,18,17,15],
                       'block':[5,2,5,3,2]},index = ['player1','player2','player3','player4','player5'])
    print(df)
             age  block   name  score
    player1   31      5  James     18
    player2   30      2  Curry     25
    player3   31      5  James     18
    player4   35      3   Kobe     17
    player5   38      2   Wade     15

    索引の変更
  • 新しいインデックス(行列)reindexを作成する:新しいインデックスを再作成すると、元のデータは新しいインデックスに基づいて並べ替えられ、インデックス値が存在しない場合、欠落した値が導入され、元のインデックスに対応する値は
  • 変化しません.
    #   inplace = True       dDataFrame   ,       
    df_reindex = df.reindex(columns = ['name','age','block','score','reb'],
               index = ['player1','player2','player3','player4','player5','player6'])
    print(df_reindex)
              name   age  block  score  reb
    player1  James  31.0    5.0   18.0  NaN
    player2  Curry  30.0    2.0   25.0  NaN
    player3  James  31.0    5.0   18.0  NaN
    player4   Kobe  35.0    3.0   17.0  NaN
    player5   Wade  38.0    2.0   15.0  NaN
    player6    NaN   NaN    NaN    NaN  NaN
    
  • インデックスにrenameを再命名するには、辞書と組み合わせてインデックスの一部を再命名するか、関連関数と組み合わせてインデックス全体を
  • に再命名することができます.
    #      
    new_index = {'player1':'PLAYER1'}
    new_col = {'name':'Name','age':'Age'}
    df_rename_dict = df.rename(index = new_index,columns = new_col) # inplace = True       DataFrame   ,       
    print(df_rename_dict)
             Age  block   Name  score
    PLAYER1   31      5  James     18
    player2   30      2  Curry     25
    player3   31      5  James     18
    player4   35      3   Kobe     17
    player5   38      2   Wade     15
    
    #      
    df_rename_fun = df.rename(columns = str.title)
    print(df_rename_fun)
             Age  Block   Name  Score
    player1   31      5  James     18
    player2   30      2  Curry     25
    player3   31      5  James     18
    player4   35      3   Kobe     17
    player5   38      2   Wade     15
    
    #  map    ,         DataFrame   
    df.columns = df.columns.map(str.title)
    df.index = df.index.map(str.upper)
    print(df)
             Age  Block   Name  Score
    PLAYER1   31      5  James     18
    PLAYER2   30      2  Curry     25
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    
  • 1 1列または複数列を行インデックスset_に変更index
  • #        
    df_set1index = df.set_index(['Name'])
    print(df_set1index)
           Age  Block  Score
    Name                    
    James   31      5     18
    Curry   30      2     25
    James   31      5     18
    Kobe    35      3     17
    Wade    38      2     15
    
    #        ,            DataFrame   ,   drop = False       
    df_set2index = df.set_index(['Name','Block'],drop = False)
    print(df_set2index)
                 Age  Block   Name  Score
    Name  Block                          
    James 5       31      5  James     18
    Curry 2       30      2  Curry     25
    James 5       31      5  James     18
    Kobe  3       35      3   Kobe     17
    Wade  2       38      2   Wade     15
    
  • ローインデックスをDataFrameの列reset_に変更index
  • df_rIdx = df.reset_index()#     drop = False,   index
    print(df_rIdx)
         index  Age  Block   Name  Score
    0  PLAYER1   31      5  James     18
    1  PLAYER2   30      2  Curry     25
    2  PLAYER3   31      5  James     18
    3  PLAYER4   35      3   Kobe     17
    4  PLAYER5   38      2   Wade     15
    

    データ削除
    主に複数の形式での行列の削除を含む
    列全体を削除
  • delで削除、元のDataFrameで直接修正削除
  • dropメソッドで削除し、削除後のレプリケーションバージョンに戻り、元のDataFrame
  • は変更されません.
    df2 = df.copy()
    print(df2)
             Age  Block   Name  Score
    PLAYER1   31      5  James     18
    PLAYER2   30      2  Curry     25
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    
    #  del    
    del df2['Age']
    print(df2)
             Block   Name  Score
    PLAYER1      5  James     18
    PLAYER2      2  Curry     25
    PLAYER3      5  James     18
    PLAYER4      3   Kobe     17
    PLAYER5      2   Wade     15
    
    #  drop    ,  axis = 0,  axis = 1     
    df2_drop = df2.drop(['Block','Score'],axis = 1)
    print(df2_drop)
              Name
    PLAYER1  James
    PLAYER2  Curry
    PLAYER3  James
    PLAYER4   Kobe
    PLAYER5   Wade
    

    行全体を削除
    df3 = df.copy()
    print(df3)
             Age  Block   Name  Score
    PLAYER1   31      5  James     18
    PLAYER2   30      2  Curry     25
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    
    #   drop  axis = 0,   
    df3_drop = df3.drop(['PLAYER1'])
    print(df3_drop)
             Age  Block   Name  Score
    PLAYER2   30      2  Curry     25
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    

    重複行の削除
  • はduplicated()を繰り返し判断し、各行が前に繰り返すか否かを示すブール型のSeriesを返し、繰り返しはTrue
  • を表示する.
    df.duplicated()
    PLAYER1    False
    PLAYER2    False
    PLAYER3     True
    PLAYER4    False
    PLAYER5    False
    dtype: bool
    

    この方法は、subset=[‘列名’]を設定して1列または複数列から重複値を判断し、keep=’last’を設定して重複項目の最後の項目にFalseを表示させ、残りはTrueとsum関数を組み合わせて迅速に判断することができ、その行に重複値があるかどうか、sumが返す数値は重複行の数である
    df.duplicated().sum()   Out:1
  • はSeriesのisを使用することもできます.Uniqueメソッドは、Seriesのvaluesが独立しているか否かを判定する、重複していない場合はTrue
  • に戻る単一列に重複値があるか否かを判定する.
    df['Name'].is_unique
    False
    
    df3_drop['Name'].is_unique
    True
    
  • 繰返し値の削除drop_を使用Duplicatesメソッドは、重複行を削除するDataFrameを返し、元のDataFrame
  • は変更しません.
    #          
    df_d = df.drop_duplicates()
    print(df_d)
             Age  Block   Name  Score
    PLAYER1   31      5  James     18
    PLAYER2   30      2  Curry     25
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    
    #               ,              ,  keep = 'last'        ,  inplace = True     DataFrame
    df_d2 = df.drop_duplicates(subset = ['Block'],keep = 'last')
    print(df_d2)
             Age  Block   Name  Score
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    

    欠落した値を含む行/列の削除
  • 欠落データをフィルタ除去するにはdropnaが一般的に使用され、削除後のレプリケーションバージョンに戻り、元のDataFrame
  • は変更されません.
    df_data = df.copy()
    df_data.iloc[1,2] = np.nan
    df_data.iloc[2] = np.nan
    print(df_data)
              Age  Block   Name  Score
    PLAYER1  31.0    5.0  James   18.0
    PLAYER2  30.0    2.0    NaN   25.0
    PLAYER3   NaN    NaN    NaN    NaN
    PLAYER4  35.0    3.0   Kobe   17.0
    PLAYER5  38.0    2.0   Wade   15.0
    
    #          NaN ,       
    data_drop = df_data.dropna()
    print(data_drop)
              Age  Block   Name  Score
    PLAYER1  31.0    5.0  James   18.0
    PLAYER4  35.0    3.0   Kobe   17.0
    PLAYER5  38.0    2.0   Wade   15.0
    
    #          NaN  ,     how = 'all'
    data_drop2 = df_data.dropna(how = 'all')
    print(data_drop2)
              Age  Block   Name  Score
    PLAYER1  31.0    5.0  James   18.0
    PLAYER2  30.0    2.0    NaN   25.0
    PLAYER4  35.0    3.0   Kobe   17.0
    PLAYER5  38.0    2.0   Wade   15.0
    
    #       ,     axis = 1
    data_drop3 = data_drop2.dropna(axis = 1)
    print(data_drop3)
              Age  Block  Score
    PLAYER1  31.0    5.0   18.0
    PLAYER2  30.0    2.0   25.0
    PLAYER4  35.0    3.0   17.0
    PLAYER5  38.0    2.0   15.0
    

    またdropnaには(thresh=None,subset=None,inplace=False)の3つのパラメータがあり,欠落値削除数のしきい値をそれぞれ制御し,subsetに基づいてカラム名の空値削除と元のDataFrameに取って代わるか否かを指定する.
    データ置換
    欠落した値の置換
  • 欠落値置換はfillna
  • を用いることができる.
    #             
    df_1v = df_data.fillna(0)
    print(df_1)
              Age  Block   Name  Score
    PLAYER1  31.0    5.0  James   18.0
    PLAYER2  30.0    2.0    NaN   25.0
    PLAYER3  30.0   10.0    NaN    NaN
    PLAYER4  35.0    3.0   Kobe   17.0
    PLAYER5  38.0    2.0   Wade   15.0
    
    #                      
    df_dict = df_data.fillna({'Age':30,'Block':10})
    print(df_dict)
              Age  Block   Name  Score
    PLAYER1  31.0    5.0  James   18.0
    PLAYER2  30.0    2.0    NaN   25.0
    PLAYER3  30.0   10.0    NaN    NaN
    PLAYER4  35.0    3.0   Kobe   17.0
    PLAYER5  38.0    2.0   Wade   15.0
    
    #    method = 'ffill'   method = 'bfill'        
    df_m = df_data.fillna(method = 'ffill')
    print(df_m)
              Age  Block   Name  Score
    PLAYER1  31.0    5.0  James   18.0
    PLAYER2  30.0    2.0  James   25.0
    PLAYER3  30.0    2.0  James   25.0
    PLAYER4  35.0    3.0   Kobe   17.0
    PLAYER5  38.0    2.0   Wade   15.0
    

    また、axis、limit、inplaceパラメータは、軸、前後の置換のしきい値、置換の有無をそれぞれ設定します.
    その他の値の置換
  • replace置換
  • #                  
    #  Curry、kobe   Stephen
    df_replace = df.replace(['Curry','Kobe'],'Stephen')
    print(df_replace)
             Age  Block     Name  Score
    PLAYER1   31      5    James     18
    PLAYER2   30      2  Stephen     25
    PLAYER3   31      5    James     18
    PLAYER4   35      3  Stephen     17
    PLAYER5   38      2     Wade     15
    
    #                
    #  Curry   Stephen, Kobe   Bryant
    df_reDict = df.replace({'Curry':'Stephen','Kobe':'Bryant'})
    print(df_reDict)
             Age  Block     Name  Score
    PLAYER1   31      5    James     18
    PLAYER2   30      2  Stephen     25
    PLAYER3   31      5    James     18
    PLAYER4   35      3   Bryant     17
    PLAYER5   38      2     Wade     15
    
    #                 
    #  Curry   Stephen, Kobe   Bryant
    df_reList = df.replace(['Curry','Kobe'],['Stephen','Bryant'])
    print(df_reList)
             Age  Block     Name  Score
    PLAYER1   31      5    James     18
    PLAYER2   30      2  Stephen     25
    PLAYER3   31      5    James     18
    PLAYER4   35      3   Bryant     17
    PLAYER5   38      2     Wade     15
    

    データ索引
    ラベルインデックスloc
  • 行インデックス
  • print(df)
             Age  Block   Name  Score
    PLAYER1   31      5  James     18
    PLAYER2   30      2  Curry     25
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15
    
    #   
    df.loc['PLAYER1']
    #   
    df.loc[['PLAYER1','PLAYER3']]#         ,    
    #     
    df.loc['PLAYER1':'PLAYER3'] #             
  • カラムインデックス
  • #   
    df['Age']
    #   
    df[['Age','Name']]#         ,    
    # loc  
    df.loc[:,'Name'] 
    PLAYER1    James
    PLAYER2    Curry
    PLAYER3    James
    PLAYER4     Kobe
    PLAYER5     Wade
    Name: Name, dtype: object
    
  • 行列共通インデックス
  • df.loc['PLAYER2',['Age','Name']]
    Age        30
    Name    Curry
    Name: PLAYER2, dtype: object
    

    位置インデックスiloc
  • 行インデックス
  • #   
    df.iloc[1]
    #     
    df.iloc[1:3] #          
  • カラムインデックス
  • #   
    df.iloc[:,1]
    #     
    df.iloc[:,1:3] #          
  • 行列同時インデックス
  • df.iloc[0:2,2:4]

    論理的に選択
    df_logic = df[df['Score']>17]
    print(df_logic)
             Age  Block   Name  Score
    PLAYER1   31      5  James     18
    PLAYER2   30      2  Curry     25
    PLAYER3   31      5  James     18
    

    データのソート
  • インデックス順sort_index
  • #     axis        ,     ascending      
    df_sort = df.sort_index(axis = 1,ascending = False)
    print(df_sort)
             Score   Name  Block  Age
    PLAYER1     18  James      5   31
    PLAYER2     25  Curry      2   30
    PLAYER3     18  James      5   31
    PLAYER4     17   Kobe      3   35
    PLAYER5     15   Wade      2   38
    
  • 値でソートsort_values
  • #     ascending      
    df_sort2 = df.sort_values(by = ['Age','Score'])
    print(df_sort2)
             Age  Block   Name  Score
    PLAYER2   30      2  Curry     25
    PLAYER1   31      5  James     18
    PLAYER3   31      5  James     18
    PLAYER4   35      3   Kobe     17
    PLAYER5   38      2   Wade     15