【发布时间】:2019-10-12 16:12:55
【问题描述】:
我有以下示例数据框:
N = np.arange(1, 10)
df = pd.DataFrame({
'ref': [ 'a', 'b', 'c', 'd', 'c', 'b', 'a', 'b', 'c'],
'a': [ 1, 2, 3, 4, 5, 6, 7, 8, 9],
'b': [ 10, 20, 30, 40, 50, 60, 70, 80, 90],
'c': [ 100, 200, 300, 400, 500, 600, 700, 800, 900],
'd': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000],
})
我想以某种方式“取消引用”ref 列,以获得此:
'ref': [ 'a', 'b', 'c', 'd', 'c', 'b', 'a', 'b', 'c'],
'ind': [ 1, 20, 300, 4000, 500, 60, 7, 80, 900],
所以ind 中的每个值都应该对应于同一位置从ref 标记的列中的值。
天真的方法是使用类似df[df['ref']] 的东西,然后乘以单位矩阵,然后按列求和。但是因为我有相当大的(~8 GB) 数据框,所以我想这样做几乎会成正比。而且感觉不对。
另外,由于只是迭代它的大小非常缓慢。而且我无法使用 Cython 进行迭代,因为将此数据帧转换为 numpy 数组会丢失标签信息,我需要正确找到该列。
有什么建议吗?..
【问题讨论】:
-
这是简单的查找:
df['ind'] = df.lookup(df.index, df['ref']) -
是的
DataFrame.lookup是一个替代方案,但它的 Python 实现效率低下。 -
df['ind'] = df.apply(lambda x: x[x['ref']], axis=1) -
是的,@ayhan 基本上是
[df.get_value(row, col) for row, col in zip(row_labels, col_labels)],见source code