逐步填充 pandas 中的缺失值

3

我有一个如下所示的数据框

Re_MC,Fi_MC,Fin_id,Res_id,     
1,2,3,4
,7,6,11
11,,31,32
,,35,38

df1 = pd.read_clipboard(sep=',')

我希望能够根据以下两个步骤来使用fillna进行填充:
a) 首先,仅比较Re_MCFi_MC。如果这些列中的一个值缺失,则从另一列中复制它。
b) 尽管执行了a步骤,如果Re_MCFi_MC仍然为NA,则从Fin_id复制值到Fi_MC,并从Res_id复制值到Re_MC
因此,我尝试了以下两种方法: 方法1 - 能够起作用但不高效/优雅
df1['Re_MC'] = df1['Re_MC'].fillna(df1['Fi_MC'])
df1['Fi_MC'] = df1['Fi_MC'].fillna(df1['Re_MC'])
df1['Re_MC'] = df1['Re_MC'].fillna(df1['Res_id'])
df1['Fi_MC'] = df1['Fi_MC'].fillna(df1['Fin_id'])

方法2 - 这种方法不起作用并提供不正确的输出

df1['Re_MC'] = df1['Re_MC'].fillna(df1['Fi_MC']).fillna(df1['Res_id'])
df1['Fi_MC'] = df1['Fi_MC'].fillna(df1['Re_MC']).fillna(df1['Fin_id'])

有没有其他有效的方法按顺序填充fillna?意思是,我们首先进行“步骤a”,然后根据“步骤a”的结果,进行“步骤b”。
我希望我的输出如下所示。

enter image description here

更新的代码

df_new = (df_new 
 .fillna({'Re MC': df_new['Re Cust'],'Re MC': df_new['Re Cust_System']})
 .fillna({'Fi MC' : df_new['Fi.Fi Customer'],'Final MC':df_new['Re.Fi Customer']})
 .fillna({'Fi MC' : df_new['Re MC']})
 .fillna({'Class Fi MC':df_new['Re MC']})
)
1个回答

3
你可以在 fillna 中使用字典:
(df1
 .fillna({'Re_MC': df1['Fi_MC'], 'Fi_MC': df1['Re_MC']})
 .fillna({'Re_MC': df1['Res_id'], 'Fi_MC': df1['Fin_id']})
)

输出:

   Re_MC  Fi_MC  Fin_id  Res_id
0    1.0    2.0       3       4
1    7.0    7.0       6      11
2   11.0   11.0      31      32
3   38.0   35.0      35      38

但是它按什么顺序执行呢?这就是字典键的工作方式吗? - The Great
是的,在Python 3.6及以上版本中,字典是有序的,因此操作按照定义的顺序应用。;) - mozway
1
@TheGreat 我知道,这并不是我的责备。但是仅仅评论说这个是不必要的,被看作是污染,因为最终有人会标记评论为不必要的,这给管理员更多的工作来检查和删除它们。但无论如何,感谢你的赞赏 ;) - mozway
一个小问题。当我运行上面的代码时,它不能一次性填充那些列中的所有NA值。因此,当我再次为第二次运行jupyter笔记本单元格时,它会填充所有NA值。是否有任何原因导致相应列的所有NA值不能一次性填充(而是必须执行两次)? - The Great
你可以在帖子底部看到更新后的代码,以了解我正在做什么。这是因为有重复的键吗? - The Great
我认为这不是逻辑中意外的或固有的。当你填充数据时,列会发生变化,所以当你再次运行代码时,你会得到一个新的迭代。例如,你有3列A、B、C,你把A填入B,把B填入A,把B填入C。如果A和B的一行中都有NaN(但C没有),则在第二次迭代之前不会填充A。 - mozway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接