2017-06-01 120 views
0

我有一個數據幀的排第一個零,我們稱之爲a,看起來像:查找大熊貓數據幀

enter image description here

我有同樣形式的另一個數據幀,但包含不同的數字。我試圖用與另一個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) 

它是如何工作的:

  • 查找數據幀
  • 移調所有非零值,這樣我就可以以相反的順序計數非零
  • 運用EQ(1)屏蔽除第一個非零以外的所有其他值 數據名稱
  • 反向次序並轉置回原始形狀和排序
  • 將NaN替換爲零。
  • 通過df_2獲得重置值
  • 最後,使用combine_first用dfin值替換NaN。

輸入:

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

我的問題很糟糕,而這正是我一直在尋找的。如果可以的話,我會加倍投票。讓我快速實施,一旦知道它的工作原理,我就會做出回答。 – Kyle