将数据框列索引设置为其他列的最有效方法
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 如果答案有帮助,请upvote
和accept
它。【参考方案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
【讨论】:
以上是关于将数据框列索引设置为其他列的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章