2014-03-13 30 views
0

我剛開始學習Pandas。將特定DataFrame行中Nan的第一次出現更改爲新值

我想知道是否有更優雅的解決方案來解決這個問題。

我有一個現有的數據幀,opis,它看起來像這樣:

    mc_1 mc_2 mc_3 mc_4 mc_5 
    opi 
    joe.blow   539 544 545 NaN NaN 
    john.doe   222 NaN NaN NaN NaN 
    jane.doe   333 555 NaN NaN NaN 

給定一個opinew_value,我想更換與new_value行中楠第一次出現。

我能夠做完成這一任務的以下內容:提前

my_opi = 'joe.blow' 
new_value = 99999 

for idx, value in enumerate(opis.loc[my_opi]): 
    if pd.isnull(value): 
     opis.loc[my_opi][idx] = new_value 
     break 

感謝。

預期輸出

    mc_1 mc_2 mc_3 mc_4 mc_5 
opi 
joe.blow   539 544 545 9999 NaN 
john.doe   222 NaN NaN NaN NaN 
jane.doe   333 555 NaN NaN NaN 

回答

1

他們是高手中的錯誤會fillna和限制(簡稱固定),但你可以做到這一點。

In [9]: df = DataFrame(dict(mc_1 = [539,222,333],mc_2=[544,np.nan,555],mc_3=[545,np.nan,np.nan],mc_4=np.nan,mc_5=np.nan),index=['joe.blow','john.doe','jane.doe']) 

In [10]: df[df.isnull() & (df.isnull().cumsum()<=1)] = 9999 

In [11]: df 
Out[11]: 
      mc_1 mc_2 mc_3 mc_4 mc_5 
joe.blow 539 544 545 9999 9999 
john.doe 222 9999 9999 NaN NaN 
jane.doe 333 555 NaN NaN NaN 

[3 rows x 5 columns] 

在0.14,你可以做

df.fillna(9999,limit=1) 

這將工作,但如果所有的價值都是該行有效的將產生一個錯誤。 您可以捕捉它,或者測試get_loc的結果以查看它是否超出列數 。

row = 'joe.blow' 

In [15]: df.ix[row,df.columns.get_loc(df.loc[row].last_valid_index())+1] = 999 

In [16]: df 
Out[16]: 
      mc_1 mc_2 mc_3 mc_4 mc_5 
joe.blow 539 544 545 999 NaN 
john.doe 222 NaN NaN NaN NaN 
jane.doe 333 555 NaN NaN NaN 

[3 rows x 5 columns] 
+0

謝謝你的答覆傑夫。我真的只想在**特定**行中替換第一次出現的NaN。我在文檔中看到了'df.fillna()',但它在**所有行上執行替換,而不是一個特定行。 – PlacidLush

+0

請把你的預期輸出則 – Jeff

+0

'mc_1 mc_2 mc_3 mc_4 mc_5' 'opi' 'joe.blow 539 544 545 9999 NaN' 'john.doe 222楠楠的NaN NaN' 'jane.doe 333 555的NaN NaN NaN' – PlacidLush

相關問題