Pandas 将特定数据帧行中第一次出现的Nan更改为新值

Pandas 将特定数据帧行中第一次出现的Nan更改为新值,pandas,Pandas,我刚刚开始学习熊猫 我想知道这个问题是否有更优雅的解决方案 我有一个现有的数据帧,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

我刚刚开始学习熊猫

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

我有一个现有的数据帧,
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
给定一个
opi
和一个
new\u值
,我想用
new\u值
替换行中第一个出现的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 

它们是master will fillna中的一个bug和一个限制(很快修复),但您可以这样做

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]
这将起作用,但如果该行中的所有值都有效,则会引发错误。 您可以捕获它,或者测试
get\u 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]

谢谢你的回复,杰夫。我真的希望只替换特定行中第一个出现的NaN。我确实看到了
df.fillna()
在文档中,但它对所有行(而不是一个特定行)执行替换。请显示您的预期输出,然后
mcu 1 mcu 2 mcu 3 mcu 4 mcu 5
opi
john.doe 222 NaN NaN NaNjane.doe333 555楠楠楠楠我正在努力。我在代码的每一行前面放了四个空格,但在注释中它不起作用。谢谢你的耐心,我很快就会解决这个问题。[链接]我放弃了使用迷你降价的尝试,所以我将结果粘贴到了这个链接中。我希望这不会不方便。
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]