2017-11-08 23 views
1

Pythonでpandasで作業していた場合は、データフレームのスライスで作業するときにchained_assignmentの警告が既に分かっています(例:hereなど)。pandas chained_assignment警告例外処理

は私が

は、と比較例外を上げ、警告メッセージ

  • "raise"を印刷し、警告
  • "warn"を無視して、

    • Noneに設定することができますオプションpandas.options.mode.chained_assignmentを見つけましたdocumentation

      最低限の例を挙げましたが、例外処理のためにtry..except..elseブロック内にこの警告を発生させました。以下の例3に示すように、例外pandas.options.mode.chained_assignment = "raise"を設定した場合にのみ例外が発生することが予想されます。

      この最小限の例では、動作は予期したとおりであるため、例2は pandas.options.mode.chained_assignment = "warn"となりますが、警告メッセージは出力されますが、例外は発生しません。

      しかし大きな枠組みの中で、Iは、最小例のように前に印刷して確認、例外はパラメータがpandas.options.mode.chained_assignment = "warn"に設定されているにもかかわらず、上昇され参照(実施例4参照)

      は他パンダはあり例外発生に関するこの警告メッセージの動作に影響を与えるパラメータ?ここ


      pd.options.mode.chained_assignmentパラメータを印刷しtry..catch..exceptブロック内の挙動を示す/設定、コードの最小の例です。

      import pandas as pd 
      
      # set the chained_assignment option 
      pd.options.mode.chained_assignment = "raise" # raises exception in case of warning 
      pd.options.mode.chained_assignment = "warn" # prints warning in case of warning, no exception is raised 
      pd.options.mode.chained_assignment = None # no warning message and no exception is raised 
      
      print "pd.options.mode.chained_assignment :", pd.options.mode.chained_assignment 
      
      # create a default pandas dataframe with two columns A,B 
      df = pd.DataFrame({"A" : [0, 1, 2], "B" : [3, 4, 5]}) 
      
      print df 
      
      # exctract a slice of the given pandas dataframe 
      df2 = df[df["A"] > 0] 
      
      # exception handling 
      try : 
          # try to modify the slice, triggering the pandas warning 
          df2["C"] = 2 
      except : 
          print "EXCEPTION RAISED" 
      else : 
          print "NO EXCEPTION" 
      
      print df2 
      

      例1次の出力でpd.options.mode.chained_assignment = None結果(警告なし、例外なく)以下の出力でpd.options.mode.chained_assignment = "warn"結果を設定


      例2

      pd.options.mode.chained_assignment : None 
          A B 
      0 0 3 
      1 1 4 
      2 2 5 
      NO EXCEPTION 
          A B C 
      1 1 4 2 
      2 2 5 2 
      
      設定 (警告印刷されますが、例外はありません)

      pd.options.mode.chained_assignment : warn 
          A B 
      0 0 3 
      1 1 4 
      2 2 5 
      NO EXCEPTION 
      C:\Users\my.name\my\directory\test.py:14: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-copy 
          df2["C"] = 2 
          A B C 
      1 1 4 2 
      2 2 5 2 
      

      例3(例外が発生し)、これは私が全く同じテストで大きな枠組みの中で見るものである

      pd.options.mode.chained_assignment : raise 
      A B 
      0 0 3 
      1 1 4 
      2 2 5 
      EXCEPTION RAISED 
          A B C 
      1 1 4 2 
      2 2 5 2 
      

      例4 次の出力でpd.options.mode.chained_assignment = "raise"結果を設定 コード。私は明示的に連鎖しpd.options.mode.chained_assignmentパラメータを設定していないが、私は例外が長い検索の後

      pd.options.mode.chained_assignment warn 
          A B 
      0 0 3 
      1 1 4 
      2 2 5 
      EXCEPTION RAISED 
          A B C 
      1 1 4 2 
      2 2 5 2 
      
  • 答えて

    0

    を上げているにもかかわらず、"warn"に設定されています参照、「悪い男」が発見されました。 別の開発者は、自分のモジュール

    import warnings 
    warnings.filterwarnings('error') 
    

    これは例外に警告をオンに次の行が含まれています。詳細については、warnings package documentation

    を参照してください。したがって、pandasオプションは「警告」に設定されていますが、私の警告は例外として扱われます