【问题标题】:How to fill NANs "ignoring" the index?如何填写“忽略”索引的 NAN?
【发布时间】:2020-11-17 22:45:48
【问题描述】:

我有两个这样的数据框:

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'] 的值将B 填充到df1,但不使用实际索引,而是-在这种情况下-只是df2['mapcol'] 的前两个条目。因此,我想使用值ab,而不是分别对应于索引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

它给出了所需的输出。

有没有更直接的方法可以避免创建所有这些中间变量?

【问题讨论】:

    标签: python pandas dataframe fillna


    【解决方案1】:

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

    【讨论】:

    • @YOBEN_S 不错...我在 cumsum 的兔子洞里掉下去了.. reindex... reset_index.. etc... etc.. etc.. +1
    • 嗯,不是原始问题的一部分,但不确定是否值得一个新问题:如果df1 中的NaNs 多于df2 可以填写的数量,它将失败。您有没有考虑到这一点的简单方法?
    • @Cleb df3=df2.reindex(range(df1.B.isna().sum())) :-) 然后df1.loc[df1.B.isna(),'B']=df3.mapcol.tolist()
    • @YOBEN_S:看起来不错;我有一个相当丑陋的df1.loc[np.where(df1['B'].isna())[0][:df2.mapcol.shape[0]], 'B']...;)我会多玩一点,然后接受一点。
    猜你喜欢
    • 2022-10-14
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多