【问题标题】:most efficient way to set dataframe column indexing to other columns将数据框列索引设置为其他列的最有效方法
【发布时间】:2021-06-01 02:46:49
【问题描述】:

我有一个大数据框。我的专栏之一包含其他人的名字。我想评估这个列并在每一行中设置引用列的值:

|A|B|C|Column|
|:|:|:|:-----|
|1|3|4|  B   |
|2|5|3|  A   |
|3|5|9|  C   |

期望的输出:

|A|B|C|Column|
|:|:|:|:-----|
|1|3|4|  3   |
|2|5|3|  2   |
|3|5|9|  9   |

我正在使用:

df.apply(lambda d: eval("d." + d['Column']), axis=1)

但它很慢,即使使用 swifter。有没有更有效的方法来执行此操作?

【问题讨论】:

    标签: pandas performance dataframe indexing eval


    【解决方案1】:

    为了获得更好的性能,请使用df.to_numpy()

    In [365]: df['Column'] = df.to_numpy()[df.index, df.columns.get_indexer(df.Column)]
    
    In [366]: df
    Out[366]: 
       A  B  C Column
    0  1  3  4      3
    1  2  5  3      2
    2  3  5  9      9
    

    【讨论】:

    • 这种没有 .to_numpy() 的方法会稍微快一些。关于为什么会发生这种情况的任何线索?
    • 没有to_numpy是什么意思?
    • df['Column'] = df.to_numpy()[df.index, df.columns.get_indexer(df.Column)] vs df['Column'] = df['Column'] .values[df.index, df.columns.get_indexer(df.Column)]
    • 我的意思是:vs df['Column'] = df.values[df.index, df.columns.get_indexer(df.Column)]
    • @Kaynef21 如果答案有帮助,请upvoteaccept 它。
    【解决方案2】:

    对于 lookup:

    df['Column'] = df.lookup(df.index, df['Column'])
    

    1.2.0+lookup 已弃用,您可以只使用for 循环:

    df['Column'] = [df.at[idx, r['Column']] for idx, r in df.iterrows()]
    

    输出:

       A  B  C  Column
    0  1  3  4       3
    1  2  5  3       2
    2  3  5  9       9
    

    【讨论】:

      【解决方案3】:

      由于lookup 将被弃用,请尝试numpy 方法与get_indexer

      df['new'] = df.values[df.index,df.columns.get_indexer(df.Column)]
      df
      Out[75]: 
         A  B  C Column new
      0  1  3  4      B   3
      1  2  5  3      A   2
      2  3  5  9      C   9
      

      【讨论】:

        猜你喜欢
        • 2019-04-14
        • 2016-07-18
        • 2019-04-11
        • 2021-08-24
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        相关资源
        最近更新 更多