如何在Pandas中使用索引向量查找?

2024-04-26 14:58:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个df,看起来像这样:

    time                a                b
0  0.000                6                5
1  0.008                6                9
2  0.016                1                9
3  0.024                2                7
4  0.032                1                5

我想使用df.a和df.b中的每个值作为以下向量中的索引:

x =  [-6, -4, -3, -2, -1, 0.5, 1, 2, 4, 6]

结果创建了两个新的列df.a_u和df.b_u,它们显示x的值,其中df.a或df.b对其进行索引。另外,我想在为第0个元素编制索引时,从每个df.a和df.b值中减去1。应该是这样的:

    time                a                b          a_      b_
0  0.000                6                5         0.5     -1
1  0.008                6                9         0.5      4
2  0.016                1                9         -6       4
3  0.024                2                7         -4       2
4  0.032                1                5         -6       -1

Tags: 元素dftime向量
3条回答

IIUC,这可以通过numpy索引解决:

x =  [-6, -4, -3, -2, -1, 0.5, 1, 2, 4, 6]
x = np.array(x)

df['a_'] = x[df['a']-1]
df['b_'] = x[df['b']-1]

# if you have more than two columns:
# for col in df.columns[1:]:
#     df[col+'_'] = x[df[col] - 1]

输出:

    time  a  b   a_   b_
0  0.000  6  5  0.5 -1.0
1  0.008  6  9  0.5  4.0
2  0.016  1  9 -6.0  4.0
3  0.024  2  7 -4.0  1.0
4  0.032  1  5 -6.0 -1.0

看起来x的索引关闭了1。但是这里有一个使用apply的快速方法

df['a_'] = df.a.apply(lambda r: x[r-1])
df['b_'] = df.b.apply(lambda r: x[r-1])

df
# returns:
    time  a  b   a_  b_
0  0.000  6  5  0.5  -1
1  0.008  6  9  0.5   4
2  0.016  1  9 -6.0   4
3  0.024  2  7 -4.0   1
4  0.032  1  5 -6.0  -1

我也使用numpy fancy索引,但我会对所有列使用它,并构造一个dict用于assign。只是一次分配多个列的另一种方式

a = np.array(x)
cols = ['a', 'b']
d = dict(zip(np.char.add(cols, '_'), a[df[cols] - 1].T))
df = df.assign(**d)

Out[721]:
    time  a  b   a_   b_
0  0.000  6  5  0.5 -1.0
1  0.008  6  9  0.5  4.0
2  0.016  1  9 -6.0  4.0
3  0.024  2  7 -4.0  1.0
4  0.032  1  5 -6.0 -1.0

相关问题 更多 >