用列的值替换DataFrame中的空值

时间:2018-11-02 14:35:08

标签: python pandas

说我有以下熊猫数据框:

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    D
0  3  2.0  NaN  0.0
1  5  4.0  2.0  NaN
2  7  NaN  NaN  5.0
3  9  3.0  NaN  4.0

我希望如果找到np.nan,那么该值将被A列中的值替换。因此,结果将是这样:

   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

我已经尝试了多种方法,但是我什么都无法工作。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:6)

这里有必要进行两次移调:

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:当前只能用dict / Series逐列填充

具有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)

答案 1 :(得分:5)

当前,+------------------------------+---------------------------------------------------+ | Items | depends on | +------------------------------+---------------------------------------------------+ | Get 2 slices of bread | | | Put peanut butter on 1 slice | Get 2 slices of bread | | Put jelly on 1 slice | Get 2 slices of bread | | Put away peanut butter jar | Put peanut butter on 1 slice | | Put slices together | Put peanut butter on 1 slice,Put jelly on 1 slice | | Put away jelly jar | Put jelly on 1 slice | +------------------------------+---------------------------------------------------+ 不允许在对齐索引时跨列广播系列。

fillna

此功能完全类似于我们希望pandas.DataFrame.mask执行的操作。查找空值,并沿fillna的{​​{1}}填充

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

答案 2 :(得分:3)

fillnareindex

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

答案 3 :(得分:0)

# for each column...
for col in df.columns:
    # I select the np.nan and I replace then with the value of A
    df.loc[df[col].isnull(), col] = df["A"]