我刚开始学习熊猫。
我想知道这个问题是否有更优雅的解决方案。
我有一个现有的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
鉴于opi
和new_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
答案 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]