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

Python Dataframe将索引映射到一列列表以提取元素

  •  1
  • Mainland  · 技术社区  · 2 年前

    我有一个数据框架,由列表作为元素组成。此外,我还有一个已知索引列表。现在,我想提取每行索引中的元素。 我的代码:

    df = pd.DataFrame({'A':[[7,8],[4,5,NaN],[NaN,1,9]],'match_idx':[1,0,NaN]})
    df
    
          A             match_idx
    0   [7, 8]          1
    1   [4, 5, nan]     0
    2   [nan, 1, 9]     NaN
    
    # in each row, let's find the values located in the match_idx position
    

    目前的解决方案:

    df['A_element'] = df.apply(lambda x: x['A'][x['match_idx']] if ~x['match_idx'].isnan() else np.nan,axis=1)
    
    AttributeError: 'float' object has no attribute 'isnan'
    

    预期解决方案:

    df = 
          A             match_idx   A_element
    0   [7, 8]          1           8
    1   [4, 5, nan]     0           4
    2   [nan, 1, 9]     NaN         NaN
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   jezrael    2 年前

    对于tet非缺失值,请使用 notna 将索引转换为整数:

    df['A_element'] = [a[int(i)] if pd.notna(i) else np.nan
                                   for a, i in zip(df['A'], df['match_idx'])]
    

    或者:

    df['A_element'] = df.apply(lambda x: x['A'][int(x['match_idx'])] 
                               if pd.notna(x['match_idx']) else np.nan,axis=1)
    
    print (df)
                 A  match_idx  A_element
    0       [7, 8]        1.0        8.0
    1  [4, 5, nan]        0.0        4.0
    2  [nan, 1, 9]        NaN        NaN