2015-09-24 221 views
1

在一個熊貓多索引數據框中,如何在依賴於包含在不同列中的特定條件的列中設置值?有條件地替換熊貓多索引數據幀中的數據

所以,我有一個數據幀,基本上是這樣的:

  COL1  COL2  COL3  COL4 
foo 1 -1.322275 1.107506 1.253344 -0.331782 
    2 -0.378448 -1.174557 -0.772984 1.476661 
    3 0.046396 0.904299 0.768654 -0.168910 
    4 1.396580 1.250713 0.193130 -0.454971 
bar 1 -1.453794 -0.393206 -0.922908 0.762605 
    2 1.375954 -1.304682 0.329339 0.606340 
    3 -2.911151 0.011083 0.771964 1.620039 
    4 0.040204 0.887082 -0.893575 1.129227 

您可以使用此代碼創建:

arrays = [np.array(['foo','foo','foo','foo','bar','bar','bar','bar']), 
      np.array([1,2,3,4,1,2,3,4])] 
df = pd.DataFrame(np.random.randn(8,4), index=arrays) 
df.columns = ['COL1','COL2','COL3','COL4'] 

我要評估 'COL1' 子幀「FOO '的值大於0,並用新值COL1/1替換(原地不復制)相應行的'COL4'值。然後,我想再次爲子幀「bar」做同樣的事情,但是應該評估「COL2」值。

我的實際數據框是巨大的,所以我一直在努力尋找比遍歷行更好的解決方案。我已經能夠有條件地取代常規數據框,但是,當我嘗試更先進的多索引和設置時,某些內容不會點擊。我可能會讓事情變得更加複雜,但我距離牆壁約45分鐘路程。

+0

我不明白'COL1/1'的意思。 COL4在索引[foo] [3]處有什麼價值?當評估COL2時,是否希望再次替換COL4值? – vmg

回答

0

我沒有完全明白你的意思,在你的'目標'欄中替代,所以我做了一些通用的。您可以根據需要替換位。

這裏有定義:

def repfunc(row,evalcol,replacecol): 
    if row[evalcol] > 0: 
     row[replacecol] = 999 #replace value goes here! 
    return row 

def repframe(df,repindex,evalcol,replacecol): 
    df.sort_index(inplace=True) 
    df.loc[repindex][replacecol] = df.loc[repindex].apply(lambda x: repfunc(x,evalcol,replacecol), axis=1).loc[:,replacecol] 

而且這裏是你怎麼稱呼它:

數據幀的
repframe(df,'foo','COL1','COL4') 

,可隨時更換參數重複另一個片段操作/列,如需要。上述操作改變這樣的數據幀:

  COL1  COL2  COL3  COL4 
foo 1 1.436672 0.213772 -0.705179 -1.297816 
    2 -0.995535 -0.067389 0.290504 -0.794496 
    3 1.375566 0.271896 -0.577298 -1.450002 
    4 -0.603792 -0.450790 -1.484757 1.401513 
bar 1 0.975558 -0.645254 -0.760839 -0.629055 
    2 -1.972025 -0.108141 1.317623 0.126768 
    3 1.947666 1.270041 -0.034555 -1.540862 
    4 -3.124269 0.176528 1.815705 0.299059 

進入這個:

  COL1  COL2  COL3  COL4 
bar 1 0.975558 -0.645254 -0.760839 -0.629055 
    2 -1.972025 -0.108141 1.317623 0.126768 
    3 1.947666 1.270041 -0.034555 -1.540862 
    4 -3.124269 0.176528 1.815705 0.299059 
foo 1 1.436672 0.213772 -0.705179 999.000000 
    2 -0.995535 -0.067389 0.290504 -0.794496 
    3 1.375566 0.271896 -0.577298 999.000000 
    4 -0.603792 -0.450790 -1.484757 1.401513 

我看你用多指標重置數據框的一列問題,因爲多指標需要進行排序的操作返回數據幀的視圖(而不是副本)。就我所知,這是necessary if you want to perform this kind of replacement in multiindexed dataframes。請注意,repframe調用sort_indexinplace=True

我的版本總是將正值替換爲999.它在行上「應用」,但我無法完全理解如何在沒有這些的情況下做到這一點。

+0

你搖滾!你肯定地指出了我的正確道路。你的版本工作,但它仍然拋出愚蠢的觀點與複製錯誤。 (我使用的是pandas0.15.2)錯誤標記是因爲lambda是否在repframe中解耦.loc? – crashMOGWAI

+0

我的意思是用'repfunc()'做類似'row [replacecol] =(row [evalcol])/ 5'的東西,但我仍然有問題。 – crashMOGWAI

+0

謝謝。很高興知道它的工作。我不知道那條消息 - 我使用的是完全相同的熊貓版本。這只是一個警告信息嗎? – vmg