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

时间:2018-04-09 06:17:06

标签: python pandas

我已经浏览了类似于一次性填写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 个答案:

答案 0 :(得分:2)

您需要为已过滤的DataFrame添加[],并为对齐列添加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