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

熊猫-使用可变列输入计算新列

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

    问题是。。。以下面的数据帧为例:

    df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': [3, 4, 5, 6, 7],'col3': [3, 4, 5, 6, 7],'col4': [1, 2, 3, 3, 2]})
    

    如果“col4”的值为1,则在索引为1的列中给我相应的值(本例中为“col2”),如果“col4”为2,则在索引为2的列中给我相应的值(本例中为“col3”),等等。

    我试过下面的方法和它的变体,但似乎没有得到正确的结果

    df["col5"] = df.apply(lambda x: df.iloc[x,df[df.columns[df["col4"]]]])
    

    非常感谢您的帮助!

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

    如果你的 'col4'

    df['col5'] = df.apply(lambda x: x[df.columns[x['col4']]], axis=1)
    
    df
    
    #   col1  col2  col3  col4  col5
    #0     1     3     3     1     3
    #1     2     4     4     2     4
    #2     3     5     5     3     3
    #3     4     6     6     3     3
    #4     5     7     7     2     7
    
        2
  •  1
  •   jpp    6 年前

    您可以在NumPy中使用奇特的索引,完全避免Python级别的循环:

    df['col5'] = df.iloc[:, :4].values[np.arange(df.shape[0]), df['col4']]
    
    print(df)
    
       col1  col2  col3  col4  col5
    0     1     3     3     1     3
    1     2     4     4     2     4
    2     3     5     5     3     3
    3     4     6     6     3     3
    4     5     7     7     2     7
    

    df = pd.concat([df]*10**4, ignore_index=True)
    
    %timeit df.apply(lambda x: x[df.columns[x['col4']]], axis=1)       # 2.36 s per loop
    %timeit df.iloc[:, :4].values[np.arange(df.shape[0]), df['col4']]  # 1.01 ms per loop