2017-06-16 14 views
0

我有一個從外部數據創建和粗略看起來像這樣添加列使用多指數數據幀值

df = pandas.DataFrame([(5, 5821, 5), 
         (5, 5819, 6), 
         (5, 5818, 7), 
         (6, 5818, 12), 
         (7, 119, 20), 
         (7, 118, 0), 
         (7, 116, 11), 
         (7, 115, 15), 
         (7, 114, 17)], 
         columns=(('ID', 'SUBID', 'VALUE'))).set_index(['ID', 'SUBID']) 

我需要保存的VALUE當前行的值的新列PREV_VALUE一個數據幀(ID, SUBID - 1)。也就是說

   VALUE PREV_VALUE 
    ID SUBID   
    5 5821  5   NaN 
     5819  6   7 
     5818  7   NaN 
    6 5818  12   NaN 
    7  119  20   0 
     118  0   NaN 
     116  11   15 
     115  15   17 
     114  17   NaN 

我可以矇混我的方式,通過使用df['PREV_VALUE'] = df.apply(lambda r: df.VALUE.get((r.name[0], r.name[1]-1), None), axis=1),這是大dataframes可怕的慢,雖然。有什麼想法嗎?

回答

0

這就是你想要的嗎?

df2 = pd.DataFrame(df.values, 
        index=pd.MultiIndex.from_tuples([(tup[0], tup[1]+1) 
                for tup in df.index.get_values()], 
                names=df.index.names), 
        columns=df.columns) 

df.join(df2, how='left', rsuffix='PREV_VALUE') 

結果:

In [126]: df.join(df2, how='left', rsuffix='PREV_VALUE') 
Out[126]: 
      VALUE VALUEPREV_VALUE 
ID SUBID 
5 5821  5    NaN 
    5819  6    7.0 
    5818  7    NaN 
6 5818  12    NaN 
7 119  20    0.0 
    118  0    NaN 
    116  11    15.0 
    115  15    17.0 
    114  17    NaN 
+0

需要說明的不是從我的例子清楚的是,'SUBID'可能有漏洞。這就是'SUBID'可能是類似於「5821,5820,5818」。 5820行需要是'NaN',因爲缺少5819。用'shift()','5818'的值會被拾取。 – user2722968

+0

@ user2722968,你可以發佈一個可重現的數據集和所需的數據集? – MaxU

+0

用更復雜的例子更新了這個問題。 – user2722968