如何填充 NANs "ignoring" 索引?

How to fill NANs "ignoring" the index?

我有两个这样的数据框:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(
    {
        'A': list('abdcde'),
        'B': ['s', np.nan, 'h', 'j', np.nan, 'g']
    }
)

df2 = pd.DataFrame(
    {
        'mapcol': list('abpppozl')
    }
)

   A    B
0  a    s
1  b  NaN
2  d    h
3  c    j
4  d  NaN
5  e    g

  mapcol
0      a
1      b
2      p
3      p
4      p
5      o
6      z
7      l

我现在想使用 df2['mapcol'] 的值在 df1 中填充 B,但不使用实际索引,但 - 在这种情况下 - 只是前两个条目df2['mapcol']。因此,我想使用值 a 和 [=17=,而不是分别对应于索引 14bp ].

一种方法是构建具有正确索引和值的字典:

df1['B_filled_incorrect'] = df1['B'].fillna(df2['mapcol'])

ind = df1[df1['B'].isna()].index

# reset_index is required as we might have a non-numerical index
val = df2.reset_index().loc[:len(ind-1), 'mapcol'].values

map_dict = dict(zip(ind, val))

df1['B_filled_correct'] = df1['B'].fillna(map_dict)

   A    B B_filled_incorrect B_filled_correct
0  a    s                  s                s
1  b  NaN                  b                a
2  d    h                  h                h
3  c    j                  j                j
4  d  NaN                  p                b
5  e    g                  g                g

这给出了所需的输出。

是否有更直接的方法来避免创建所有这些中间变量?

position fill 您可以通过loc赋值并将填充值转换为list

df1.loc[df1.B.isna(),'B']=df2.mapcol.iloc[:df1.B.isna().sum()].tolist()
df1
Out[232]: 
   A  B
0  a  s
1  b  a
2  d  h
3  c  j
4  d  b
5  e  g