python - 如何填充 NAN "ignoring"索引?

标签 python pandas dataframe fillna

我有两个这样的数据框:

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
我现在想填Bdf1使用 df2['mapcol'] 的值,但不使用实际索引,而是 - 在这种情况下 - 只是 df2['mapcol'] 的前两个条目.所以,而不是 bp对应于索引 14 ,我想分别使用值 ab .
一种方法是构造一个具有正确索引和值的字典:
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
这给出了所需的输出。
有没有更直接的方法可以避免创建所有这些中间变量?

最佳答案

位置填充您可以通过 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

关于python - 如何填充 NAN "ignoring"索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63135047/

相关文章:

Python Pandas 只比较相同标签的 DataFrame 对象

python - 在 docker 容器上安装 rdiff

python - 属性错误: 'str' object has no attribute (function)

python - 如何根据条件检查两行并将其合并为python中的单行

scala - 从 scala 中的嵌套 json 文件创建 spark 数据框

python - 如何更改 iterrows() 的起始索引?

python - gdb 找到调试信息但不能下断点

pandas - 一次设置多列给出错误 "Not in index error!"

python-3.x - 重新索引数据帧会用 NaN 替换我的所有数据,为什么?

python - 将前 n 个非 NaN 单元格保留在 pandas DataFrame 的每一行中