pandas fillna依次逐步

发布于 2025-01-30 11:01:18 字数 1447 浏览 4 评论 0原文

我有类似的数据框,如下所示,

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=',')

我想基于两个步骤

a)首先,仅比较re_mcfi_mc。如果这些列中的任何一个中都缺少一个值,请从另一列复制它。

b)尽管执行了步骤A,则如果re_mcfi_mc仍然有NA代码>和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'])

是否还有其他有效的方法以连续的方式填充na?意思是,我们首先进行步骤a,然后根据步骤a的结果,

我们希望我的输出如图所示。下面

更新的代码

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']})
)

I have dataframe like as below

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=',')

I would like to fillna based on two steps

a) First, compare only Re_MC and Fi_MC. If a value is missing in either of these columns, copy it from the other column.

b) Despite doing step a, if there is still NA for either Re_MC or Fi_MC, copy values from Fin_id for Fi_MC and Res_id for Re_MC.

So, I tried the below two approaches

Approach 1 - This works but not efficient/elegant

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

Approach 2 - This doesn't work and provide incorrect output

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

Is there any other efficient way to fillna in a sequential manner? Meaning, we do step a first and then based on result of step a, we do step b

I expect my output to be like as shown below

enter image description here

updated code

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']})
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梨涡 2025-02-06 11:01:18

您可以在

(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

You can use dictionaries in fillna:

(df1
 .fillna({'Re_MC': df1['Fi_MC'], 'Fi_MC': df1['Re_MC']})
 .fillna({'Re_MC': df1['Res_id'], 'Fi_MC': df1['Fin_id']})
)

output:

   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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文