将特定DataFrame行中第一次出现的Nan更改为新值

时间:2014-03-13 12:56:28

标签: pandas

我刚开始学习熊猫。

我想知道这个问题是否有更优雅的解决方案。

我有一个现有的DataFrame,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替换行中第一次出现的Nan。

我能够通过以下方式实现这一目标:

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 个答案:

答案 0 :(得分:1)

他们是主人将填充的一个错误和限制(很快修复),但你可以这样做。

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]