2017-06-01 20 views
0

の行の最初のゼロを見つけ、我々は次のようになりますこと、aと呼ぶことにします。最後の非ゼロ値を他のDataFrameの同じ位置にある値で埋めることを試みています。私は、各行をループし、その行の各列と値の比較を行うことなくこれを行う方法を概念化することさえ問題にしています。これを行うには別の、より良い方法がありますか?私はデータフレームを持っているパンダのデータフレーム

それは遅れているが、私はとにかく刺しを取るつもりです:私が正しくあなたの質問を理解している場合

+3

これはあなたが1)代表コードと2の少ない量を生成することを実行可能な例を提供した場合に答えるためにはるかに容易に問題になりますが)あなたはすでに試したものを実証しました。 –

+0

フィードバック@ PaulHを高く評価します。私は明日の朝にこれに追加します。 – Kyle

答えて

1

。仕組み

(dfin.ne(0).T[::-1].cumsum().eq(1)[::-1].T*df_2).replace(0,pd.np.nan).combine_first(dfin) 

:データフレーム

  • トランスポーズにすべての非ゼロ値を探す

    • ので、私は逆の順序で(1)マスクする
    • 使用EQを非ゼロをカウントすることができます最初の非ゼロ以外の他のすべての値 データファイル
    • 元の形状とソートへの逆順と転置
    • 0にNaNを代入します。
    • 置換値を取得するためにdf_2を使用する
    • 最後に、combine_firstを使用してNaNをdfin値で置き換えます。

    入力:

    print(dfin) 
         2017-05-31 2017-06-30 2017-07-31 2017-08-31 2017-09-30 \ 
    560101  7910.0   0.0   0.0   0.0   0.0 
    364672  7457.0  4656.0  5778.0  1482.0  2906.0 
    786073  2201.0   0.0   0.0   0.0   0.0 
    437551  3063.0  5975.0  7518.0   0.0   0.0 
    343474  3263.0  3559.0  8417.0  1024.0   0.0 
    742817  6997.0  2192.0  6550.0  8410.0  7804.0 
    197776  2177.0  8532.0  4019.0  3373.0  2529.0 
    262179  8696.0  4426.0   0.0   0.0   0.0 
    867695  6766.0  4775.0  7633.0  4556.0  8619.0 
    266410  3385.0  1746.0  4360.0  1561.0  9184.0 
    
         2017-10-31 2017-11-30 2017-12-31 2018-01-31 2018-02-28 
    560101   0.0   0.0   0.0   0.0   0.0 
    364672  3541.0  3078.0  9971.0   0.0   0.0 
    786073   0.0   0.0   0.0   0.0   0.0 
    437551   0.0   0.0   0.0   0.0   0.0 
    343474   0.0   0.0   0.0   0.0   0.0 
    742817  4009.0  7788.0  9376.0   0.0   0.0 
    197776  5658.0  7246.0  7403.0  3186.0  2669.0 
    262179   0.0   0.0   0.0   0.0   0.0 
    867695  2867.0   0.0   0.0   0.0   0.0 
    266410   0.0   0.0   0.0   0.0   0.0 
    
    print(df_2) #replacement values datafame 
         2017-05-31 2017-06-30 2017-07-31 2017-08-31 2017-09-30 \ 
    560101  9999  9999  9999  9999  9999 
    364672  9999  9999  9999  9999  9999 
    786073  9999  9999  9999  9999  9999 
    437551  9999  9999  9999  9999  9999 
    343474  9999  9999  9999  9999  9999 
    742817  9999  9999  9999  9999  9999 
    197776  9999  9999  9999  9999  9999 
    262179  9999  9999  9999  9999  9999 
    867695  9999  9999  9999  9999  9999 
    266410  9999  9999  9999  9999  9999 
    
         2017-10-31 2017-11-30 2017-12-31 2018-01-31 2018-02-28 
    560101  9999  9999  9999  9999  9999 
    364672  9999  9999  9999  9999  9999 
    786073  9999  9999  9999  9999  9999 
    437551  9999  9999  9999  9999  9999 
    343474  9999  9999  9999  9999  9999 
    742817  9999  9999  9999  9999  9999 
    197776  9999  9999  9999  9999  9999 
    262179  9999  9999  9999  9999  9999 
    867695  9999  9999  9999  9999  9999 
    266410  9999  9999  9999  9999  9999 
    

    df_2から同じ位置の値とdfinの各行最後の非ゼロ値を交換します。

    (dfin.ne(0).T[::-1].cumsum().eq(1)[::-1].T*df_2).replace(0,pd.np.nan).combine_first(dfin) 
    

    出力:

     2017-05-31 2017-06-30 2017-07-31 2017-08-31 2017-09-30 \ 
    560101  9999.0   0.0   0.0   0.0   0.0 
    364672  7457.0  4656.0  5778.0  1482.0  2906.0 
    786073  9999.0   0.0   0.0   0.0   0.0 
    437551  3063.0  5975.0  9999.0   0.0   0.0 
    343474  3263.0  3559.0  8417.0  9999.0   0.0 
    742817  6997.0  2192.0  6550.0  8410.0  7804.0 
    197776  2177.0  8532.0  4019.0  3373.0  2529.0 
    262179  8696.0  9999.0   0.0   0.0   0.0 
    867695  6766.0  4775.0  7633.0  4556.0  8619.0 
    266410  3385.0  1746.0  4360.0  1561.0  9999.0 
    
         2017-10-31 2017-11-30 2017-12-31 2018-01-31 2018-02-28 
    560101   0.0   0.0   0.0   0.0   0.0 
    364672  3541.0  3078.0  9999.0   0.0   0.0 
    786073   0.0   0.0   0.0   0.0   0.0 
    437551   0.0   0.0   0.0   0.0   0.0 
    343474   0.0   0.0   0.0   0.0   0.0 
    742817  4009.0  7788.0  9999.0   0.0   0.0 
    197776  5658.0  7246.0  7403.0  3186.0  9999.0 
    262179   0.0   0.0   0.0   0.0   0.0 
    867695  9999.0   0.0   0.0   0.0   0.0 
    266410   0.0   0.0   0.0   0.0   0.0 
    
  • +1

    私の質問はひどく、これはまさに私が探していたものです。もし私ができるなら、私は10倍upvoteします。私は迅速に実装してみましょう、私はそれが動作することを知っていると答えた印を付けます。 – Kyle

    関連する問題