2015-07-13 28 views
1

假設我有以下pandas數據框:如何在Pandas中將當前行項目設置爲更小(如果更小)?

table = [[datetime.datetime(2015, 1, 31), 1, 0.5], 
     [datetime.datetime(2015, 2, 27), 1, 2], 
     [datetime.datetime(2015, 3, 31), 1, 1.5], 
     [datetime.datetime(2015, 4, 30), 1, 0], 
     [datetime.datetime(2015, 5, 31), 1, 2], 
     [datetime.datetime(2015, 6, 30), 1, 1.2], 
     [datetime.datetime(2015, 7, 31), 1, 3], 
     [datetime.datetime(2015, 8, 31), 1, 0]] 

df = pd.DataFrame(table, columns=['Date', 'Id', 'Value']) 

     Date Id Value 
0 2015-01-31 1 0.5 
1 2015-02-27 1 2.0 
2 2015-03-31 1 1.5 
3 2015-04-30 1 0.0 
4 2015-05-31 1 2.0 
5 2015-06-30 1 1.2 
6 2015-07-31 1 3.0 
7 2015-08-31 1 0.0 

我希望通過df一個簡單的方法來循環和Value當前元素設置爲先前的,如果是小於或等於,如果添加一個布爾元素已被更改爲前一個。但是,我對如何這樣做感到茫然。由此產生的數據框將是:

 Date Id Value Altered 
0 2015-01-31 1 0.5 False 
1 2015-02-27 1 2.0 False 
2 2015-03-31 1 2.0 True 
3 2015-04-30 1 2.0 True 
4 2015-05-31 1 2.0 True 
5 2015-06-30 1 2.0 True 
6 2015-07-31 1 3.0 False 
7 2015-08-31 1 3.0 True 

回答

2

您可以使用cummax()來計算列的累積最大值。

商店cummax()作爲一個臨時變量,它與原來的列比較,以獲得「改變」一欄,然後將其指定爲新的「值」列結果:

temp = df.Value.cummax() 
df['Altered'] = df.Value < temp 
df['Value'] = temp 

這給:

>>> df 
     Date Id Value Altered 
0 2015-01-31 1 0.5 False 
1 2015-02-27 1 2.0 False 
2 2015-03-31 1 2.0 True 
3 2015-04-30 1 2.0 True 
4 2015-05-31 1 2.0 False 
5 2015-06-30 1 2.0 True 
6 2015-07-31 1 3.0 False 
7 2015-08-31 1 3.0 True 

(注值在「改變」指數4是假的,而不是真實的,因爲值保持2.0)再次

+0

好奇的問題,爲什麼第4行不同於預期的結果? – deinonychusaur

+0

@deinonychusaur:索引4處的值在累積最大值欄中保持爲2.0:未更改。 (也許這是OP預期輸出中的拼寫錯誤。) –

+0

我認爲定義等於與文本中的OP表達式相同,如果這是相關的,則使其有點棘手。 – deinonychusaur

3

使用.cummax()獲取最大值爲最新。將其與Value列進行比較,看它是否被更改。

import pandas as pd 
import datetime 

table = [[datetime.datetime(2015, 1, 31), 1, 0.5], 
    [datetime.datetime(2015, 2, 27), 1, 2], 
    [datetime.datetime(2015, 3, 31), 1, 1.5], 
    [datetime.datetime(2015, 4, 30), 1, 0], 
    [datetime.datetime(2015, 5, 31), 1, 2], 
    [datetime.datetime(2015, 6, 30), 1, 1.2], 
    [datetime.datetime(2015, 7, 31), 1, 3], 
    [datetime.datetime(2015, 8, 31), 1, 0]] 

df = pd.DataFrame(table, columns=['Date', 'Id', 'Value']) 
df['New_Value'] = df.Value.cummax() 
df['Altered'] = df['New_Value'] > df['Value'] 

print(df) 


     Date Id Value New_Value Altered 
0 2015-01-31 1 0.5  0.5 False 
1 2015-02-27 1 2.0  2.0 False 
2 2015-03-31 1 1.5  2.0 True 
3 2015-04-30 1 0.0  2.0 True 
4 2015-05-31 1 2.0  2.0 False 
5 2015-06-30 1 1.2  2.0 True 
6 2015-07-31 1 3.0  3.0 False 
7 2015-08-31 1 0.0  3.0 True 
+0

謝謝,張建勳! – Tingiskhan

相關問題