2014-06-14 86 views
3

我試圖根據列中的條件重複DataFrame中的行值。如果在列變化= 1的值,然後我想重複列中的值A,B,和C直至下一個變化= 1基於條件的熊貓DataFrame重複值

index = pandas.date_range('20000131', periods=5) 
columns = ['A', 'B', 'C', 'Change'] 

data = {'A': pandas.Series([False, True, False, True, False], index=index) 
    , 'B': pandas.Series([True, True, False, False, False], index=index) 
    , 'C': pandas.Series([True, False, True, True, True], index=index) 
    , 'Change' : pandas.Series([1,0,0,1,0], index=index)} 

結果:

   A  B  C Change 
2000-01-31 False True True  1 
2000-02-01 True True False  0 
2000-02-02 False False True  0 
2000-02-03 True False True  1 
2000-02-04 False False True  0 

期望結果:

   A  B  C Change 
2000-01-31 False True True  1 
2000-02-01 False True True  0 
2000-02-02 False True True  0 
2000-02-03 True False True  1 
2000-02-04 True False True  0 

這是最接近我已經能夠使用移()得到的,但它只能持續一排。我需要它堅持N行。在下面的例子中,它在第三行(或者第二行以0基數)分解。

print pandas.DataFrame(numpy.where(pandas.DataFrame(df['Change']==1) 
    , df, df.shift())) 

結果:

 0  1  2 3 
0 False True True 1 
1 False True True 1 
2 False True False 0 
3 True False True 1 
4 True False True 1 

謝謝。

回答

5

你可以在更改== 0填充行與南和ffill:

In [11]: df.loc[df.Change != 1, ['A', 'B', 'C']] = numpy.nan 

In [12]: df 
Out[12]: 
      A B C Change 
2000-01-31 0 1 1  1 
2000-02-01 NaN NaN NaN  0 
2000-02-02 NaN NaN NaN  0 
2000-02-03 1 0 1  1 
2000-02-04 NaN NaN NaN  0 

In [13]: df.ffill() 
Out[13]: 
      A B C Change 
2000-01-31 0 1 1  1 
2000-02-01 0 1 1  0 
2000-02-02 0 1 1  0 
2000-02-03 1 0 1  1 
2000-02-04 1 0 1  0 

如果你需要這些是布爾列,然後在每一列使用astype(bool)

順便說一句,你可以這與重採樣(除了最後缺少的行和列更改):

In [14]: df[df.Change == 1].resample('D', fill_method='ffill') 
Out[14]: 
      A B C Change 
2000-01-31 0 1 1  1 
2000-02-01 0 1 1  1 
2000-02-02 0 1 1  1 
2000-02-03 1 0 1  1 
+1

感謝安迪!你已經回答了我在這裏搜索的大部分問題。填補作品完美。我其實更喜歡1和0。我感謝快速幫助。 – tkfbristol