为了账号安全,请及时绑定邮箱和手机立即绑定

用列的值替换 DataFrame 中的空值

用列的值替换 DataFrame 中的空值

慕标5832272 2021-08-05 17:41:06
假设我有以下熊猫数据框:df = pd.DataFrame([[3, 2, np.nan, 0],                    [5, 4, 2, np.nan],                    [7, np.nan, np.nan, 5],                    [9, 3, np.nan, 4]],                    columns=list('ABCD'))返回这个:   A    B    C    D0  3  2.0  NaN  0.01  5  4.0  2.0  NaN2  7  NaN  NaN  5.03  9  3.0  NaN  4.0如果找到 np.nan,我希望该值被 A 列中的值替换。所以这意味着结果是这样的:   A    B    C    D0  3  2.0  3.0  0.01  5  4.0  2.0  5.02  7  7.0  7.0  5.03  9  3.0  9.0  4.0我已经尝试了多种方法,但我什么都做不了。任何人都可以帮忙吗?
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

这是必要的双转置:


cols = ['B','C', 'D']

df[cols] = df[cols].T.fillna(df['A']).T

print(df)

   A    B    C    D

0  3  2.0  3.0  0.0

1  5  4.0  2.0  5.0

2  7  7.0  7.0  5.0

3  9  3.0  9.0  4.0

因为:


df[cols] = df[cols].fillna(df['A'], axis=1)

print(df)

NotImplementedError:目前只能逐列填充字典/系列


带有numpy.where和广播列的另一种解决方案A:


df = pd.DataFrame(np.where(df.isnull(), df['A'].values[:, None], df), 

                  index=df.index, 

                  columns=df.columns)

print (df)

     A    B    C    D

0  3.0  2.0  3.0  0.0

1  5.0  4.0  2.0  5.0

2  7.0  7.0  7.0  5.0

3  9.0  3.0  9.0  4.0

谢谢@pir 提供另一种解决方案:


df = pd.DataFrame(np.where(df.isnull(), df[['A']], df), 

                  index=df.index, 

                  columns=df.columns)


查看完整回答
反对 回复 2021-08-05
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

目前,fillna不允许在对齐索引时跨列广播系列。


pandas.DataFrame.mask

这与我们想要fillna做的完全一样。找到空值,填充它与df.A沿axis=0


df.mask(df.isna(), df.A, axis=0)


   A    B    C    D

0  3  2.0  3.0  0.0

1  5  4.0  2.0  5.0

2  7  7.0  7.0  5.0

3  9  3.0  9.0  4.0

pandas.DataFrame.fillna 使用字典

但是,您可以将字典传递fillna给它,告诉它对每一列做什么。


df.fillna({k: df.A for k in df})


   A    B    C    D

0  3  2.0  3.0  0.0

1  5  4.0  2.0  5.0

2  7  7.0  7.0  5.0

3  9  3.0  9.0  4.0


查看完整回答
反对 回复 2021-08-05
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

DOfillna用reindex


df.fillna(df[['A']].reindex(columns=df.columns).ffill(1))

Out[20]: 

   A    B    C    D

0  3  2.0  3.0  0.0

1  5  4.0  2.0  5.0

2  7  7.0  7.0  5.0

3  9  3.0  9.0  4.0

要么 combine_first


df.combine_first(df.fillna(0).add(df.A,0))

Out[35]: 

   A    B    C    D

0  3  2.0  3.0  0.0

1  5  4.0  2.0  5.0

2  7  7.0  7.0  5.0

3  9  3.0  9.0  4.0


查看完整回答
反对 回复 2021-08-05
  • 3 回答
  • 0 关注
  • 439 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信