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

pandas numpy KeyError:“['1''2''3''4']不在索引中”

  •  0
  • William  · 技术社区  · 3 年前

    我有一个数据帧,你可以运行以下代码:

    import numpy as np
    import pandas as pd
    from io import StringIO
    
    df4s = """
       LowerAge    age    1       2      3      4 
    0  2            3     o.234   o.234  o.234  o.234
    1  3            4     o.234   o.234  o.234  o.234
    2  4            2     o.234   o.234  o.234  o.234      
    3  5            3     o.234   o.234  o.234  o.234         
    """
    df4 = pd.read_csv(StringIO(df4s.strip()), sep='\s+')
    
    df4
    

    输出为:

      LowerAge  age   1       2       3       4
    0   2       3     o.234   o.234   o.234   o.234
    1   3       4     o.234   o.234   o.234   o.234
    2   4       2     o.234   o.234   o.234   o.234
    3   5       3     o.234   o.234   o.234   o.234
    

    现在的逻辑是这样的:对于每一行,如果LowerAge-1<年龄,则df4[str(LowerAge-1)]=1,否则将保持不变,例如:

    在第一行中,LowerAge-1等于1且小于age,,则列“1”的值(因为LowerAge-1等于1)将等于1,

    在第二行中,LowerAge-1等于2,并且它小于age,那么列“2”的值将等于1。

    最终输出应为:

      LowerAge  age  '1'     '2'     '3'     '4'
    0   2       3     1      o.234   o.234   o.234
    1   3       4     o.234  1       o.234   o.234
    2   4       2     o.234  o.234   o.234   o.234
    3   5       3     o.234  o.234   o.234   o.234
    

    我的代码是:

    lower_v=df4['LowerAge'].values - 1
    
    df4[lower_v.astype(str)]=np.where(lower_v<df4['age'],1,df4[lower_v.astype(str)])
    

    错误:

    ---> 19 df4[lower_v.astype(str)]=np.where(lower_v<df4['age'],1,df4[lower_v.astype(str)])
    KeyError: "['1' '2' '3' '4'] not in index"
    

    有朋友能帮忙吗?

    0 回复  |  直到 3 年前
        1
  •  0
  •   kelyen    3 年前

    不会修复您的代码,但当前的错误是由于您的列 '1' '2' 引用。删除df定义中的这些引号可以消除此错误,但代码也没有返回预期结果:

    df4s = """
       LowerAge    age    1      2     3       4  
    0  2            3     o.234   o.234  o.234  o.234
    1  3            4     o.234   o.234  o.234  o.234
    2  4            2     o.234   o.234  o.234  o.234      
    3  5            3     o.234   o.234  o.234  o.234         
    """
    
        2
  •  0
  •   Wahyu Hadinoto    3 年前

    我更喜欢用切片来解决这个问题,所以你可以试试这个:

    for i in range(len(df4)):
        index_age = df4['LowerAge'].iloc[i]-1
        if index_age<df4['age'].iloc[i]:
            df4.iloc[i,index_age+1] = 1
    

    结果是: enter image description here

        3
  •  0
  •   gilf0yle    3 年前

    你可以这样做:

    def fun(x):
      if x['LowerAge']-1<x['age']:
        if x['LowerAge']-1<4:
          x[str(x['LowerAge']-1)]=1
      return x
    df4.apply(fun,axis=1)
    

    输出:

      LowerAge  age  '1'     '2'     '3'     '4'
    0   2       3     1      o.234   o.234   o.234
    1   3       4     o.234  1       o.234   o.234
    2   4       2     o.234  o.234   o.234   o.234
    3   5       3     o.234  o.234   o.234   o.234
    

    说到时间复杂度,线性复杂度是必须的,因为我们需要检查每一行。也许有更好的解决方案,但这个解决方案不会花费你太多。