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
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]