将数据框列索引设置为其他列的最有效方法

Posted

技术标签:

【中文标题】将数据框列索引设置为其他列的最有效方法【英文标题】: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。有没有更有效的方法来执行此操作?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于将数据框列索引设置为其他列的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

按列索引熊猫数据框重命名列

PySpark:使用一列索引另一列(两列的udf?)

有没有办法在行和列索引上合并熊猫数据框?

用于搜索的 Pandas 列索引?

根据其他列将数据框的一列转换为numpy数组或张量

pandas将某一行设置为列索引(python)