使用多个值填充多列中的缺失值

3

我已经阅读过类似于一次填写pandas多列的帖子,但是我的问题似乎有些不同,因为我需要能够使用特定的列值填充缺失的列值,并且能够在一次操作中对多个列进行操作。

例如:我可以单独使用以下命令来填充NA:

result1_copy['BASE_B'] = np.where(pd.isnull(result1_copy['BASE_B']), result1_copy['BASE_S'], result1_copy['BASE_B'])

result1_copy['QWE_B'] = np.where(pd.isnull(result1_copy['QWE_B']), result1_copy['QWE_S'], result1_copy['QWE_B'])

然而,如果我试图一次性填充它,它就不起作用:

result1_copy['BASE_B','QWE_B'] = result1_copy['BASE_B', 'QWE_B'].fillna(result1_copy['BASE_S','QWE_S'])

我们知道为什么吗? 请注意,这里只使用了2列是为了方便起见,但我需要填充的列有10个。它们要么是对象,浮点数或日期时间。 数据类型是问题所在吗?

1个回答

2
您需要为筛选后的数据框添加[],并为对齐列添加rename
d = {'BASE_S':'BASE_B', 'QWE_S':'QWE_B'}
result1_copy[['BASE_B','QWE_B']] = result1_copy[['BASE_B', 'QWE_B']]
                                     .fillna(result1_copy[['BASE_S','QWE_S']]
                                     .rename(columns=d))

更具动态性的解决方案:

L = ['BASE_','QWE_']
orig = ['{}B'.format(x) for x in L]
new =  ['{}S'.format(x) for x in L]

d = dict(zip(new, orig))
result1_copy[orig] = (result1_copy[orig].fillna(result1_copy[new]
                                        .rename(columns=d)))

如果匹配列具有BS,另一种解决方案是:

for x in ['BASE_','QWE_']:
    result1_copy[x + 'B'] = result1_copy[x + 'B'].fillna(result1_copy[x + 'S'])

示例:

result1_copy = pd.DataFrame({'A':list('abcdef'),
                   'BASE_B':[np.nan,5,4,5,5,np.nan],
                   'QWE_B':[np.nan,8,9,4,2,np.nan],
                   'BASE_S':[1,3,5,7,1,0],
                   'QWE_S':[5,3,6,9,2,4],
                   'F':list('aaabbb')})


print (result1_copy)
   A  BASE_B  BASE_S  F  QWE_B  QWE_S
0  a     NaN       1  a    NaN      5
1  b     5.0       3  a    8.0      3
2  c     4.0       5  a    9.0      6
3  d     5.0       7  b    4.0      9
4  e     5.0       1  b    2.0      2
5  f     NaN       0  b    NaN      4

d = {'BASE_S':'BASE_B', 'QWE_S':'QWE_B'}
result1_copy[['BASE_B','QWE_B']] = (result1_copy[['BASE_B', 'QWE_B']]
                                      .fillna(result1_copy[['BASE_S','QWE_S']]
                                      .rename(columns=d)))
print (result1_copy) 
   A  BASE_B  BASE_S  F  QWE_B  QWE_S
0  a     1.0       1  a    5.0      5
1  b     5.0       3  a    8.0      3
2  c     4.0       5  a    9.0      6
3  d     5.0       7  b    4.0      9
4  e     5.0       1  b    2.0      2
5  f     0.0       0  b    4.0      4

谢谢@jezrael,但是我对在这种情况下使用rename方法有点困惑?我们需要它吗? - asimo
1
@asimo - 尝试省略它,不做任何更改。 :) 问题是在 fillna 中需要两个数据框具有相同的列名。 - jezrael
1
这很整洁 :) 对于x in ['BASE_','QWE_']: result1_copy[x + 'B'] = result1_copy[x + 'B'].fillna(result1_copy[x + 'S']) - asimo

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