代码之家  ›  专栏  ›  技术社区  ›  Cranjis

索引之间的熊猫数据帧填充值

  •  1
  • Cranjis  · 技术社区  · 6 年前

    我有一个数据框架上的索引列表,有5列。

    indexes = [5,9,44]
    

    我想创建一个pd.series,在索引之间使用某个列的值。 所以,如果

    row#5 = ["a","b","c","d","e"]
    row#9 = ["q","w","e","r","t"]
    row#44= ["z","x","c","v","b"]
    

    列的宽度是3, 我想要一个向量 "d" 索引中 0-5 , "r" 在索引中 5-9 ,和 "v" 在索引中 9-44 nan 在索引中 44+ . 最好的方法是什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    解决方案在默认情况下工作 RangeIndex -转换外部的所有值 indexes ES到 NaN 以及回填值:

    indexes = [5,9,44]
    columns_idx = 3
    
    out = df.iloc[:, columns_idx].where(df.index.isin(indexes)).bfill()
    

    另一个解决方案:

    df.iloc[:, columns_idx] = df.iloc[indexes, columns_idx]
    out = df.iloc[:, columns_idx].bfill()
    

    样品 :

    np.random.seed(343)
    df = pd.DataFrame(np.random.randint(100, size=(20, 5)), columns=list('abcde'))
    print(df)
         a   b   c   d   e
    0   63  18  56  22  50
    1   22  12   4  38  23
    2   65  19   2  13  51
    3   43  90  46  44  36
    4   74  43  92  34  18
    5   39  24  62  21   5
    6   19  90  51  79  77
    7    3   0  51  26  22
    8   36  54  25  22   4
    9    5  66  76  98  65
    10  42  95  89  49  98
    11  84  82  88  87  35
    12  63  58  17  72  92
    13  78  47  71  23   3
    14  37  60  82  96  66
    15  18  83  93  82  82
    16  34  77   2  50  17
    17  63   8  78  74  89
    18  25  86  83  42  77
    19  82  35  77  46  42
    
    indexes = [5,9,14]
    columns_idx = 3
    

    out = df.iloc[:, columns_idx].where(df.index.isin(indexes)).bfill()
    print (out)
    0     21.0
    1     21.0
    2     21.0
    3     21.0
    4     21.0
    5     21.0
    6     98.0
    7     98.0
    8     98.0
    9     98.0
    10    96.0
    11    96.0
    12    96.0
    13    96.0
    14    96.0
    15     NaN
    16     NaN
    17     NaN
    18     NaN
    19     NaN
    Name: d, dtype: float64
    

    解释 :

    比较索引值 True 每个指数来自 指标 具有 isin :

    print (df.index.isin(indexes))
    [False False False False False  True False False False  True False False
     False False  True False False False False False]
    

    按位置查看列 DataFrame.iloc :

    print (df.iloc[:, columns_idx])
    0     22
    1     38
    2     13
    3     44
    4     34
    5     21
    6     79
    7     26
    8     22
    9     98
    10    49
    11    87
    12    72
    13    23
    14    96
    15    82
    16    50
    17    74
    18    42
    19    46
    Name: d, dtype: int32
    

    将不匹配的值替换为 where 以下内容:

    print (df.iloc[:, columns_idx].where(df.index.isin(indexes)))
    0      NaN
    1      NaN
    2      NaN
    3      NaN
    4      NaN
    5     21.0
    6      NaN
    7      NaN
    8      NaN
    9     98.0
    10     NaN
    11     NaN
    12     NaN
    13     NaN
    14    96.0
    15     NaN
    16     NaN
    17     NaN
    18     NaN
    19     NaN
    Name: d, dtype: float64
    

    最后一次填充缺少的值:

    print (df.iloc[:, columns_idx].where(df.index.isin(indexes)).bfill())
    0     21.0
    1     21.0
    2     21.0
    3     21.0
    4     21.0
    5     21.0
    6     98.0
    7     98.0
    8     98.0
    9     98.0
    10    96.0
    11    96.0
    12    96.0
    13    96.0
    14    96.0
    15     NaN
    16     NaN
    17     NaN
    18     NaN
    19     NaN
    Name: d, dtype: float64