在pandas框架列中查找数组元素的位置pd系列)

2024-06-28 19:04:04 发布

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

我有一个类似于这个的熊猫架:

import pandas as pd
import numpy as np

data = {'Col1' : [4,5,6,7], 'Col2' : [10,20,30,40], 'Col3' : [100,50,-30,-50], 'Col4' : ['AAA', 'BBB', 'AAA', 'CCC']}

df = pd.DataFrame(data=data, index = ['R1','R2','R3','R4'])

    Col1  Col2  Col3 Col4
R1     4    10   100  AAA
R2     5    20    50  BBB
R3     6    30   -30  AAA
R4     7    40   -50  CCC

给定一组目标:

^{pr2}$

{{{cd1}中的元素也将出现在cd1}中。在

我试图找到一个书面的答案,但似乎超出了我的能力。。。有人有什么建议吗?在

顺便说一下,对于这种特殊情况,我可以输入一个目标数组,其元素是数据帧索引名array(['R1', 'R3', 'R5'])。那样容易些吗?在

编辑1:

非常感谢你的回复。很遗憾,我只能选一个,但似乎每个人都认为@Divakar是最好的。不过,您应该看看piRSquared和MaxU的速度比较,看看所有的可能性


Tags: importdataascol2col3col1pdr2
3条回答

您可以使用^{}-

df.index[np.in1d(df['Col4'],target_array)]

说明

1)创建与每行相对应的1D掩码,告诉我们col4's元素与{}中的任何元素是否匹配:

^{pr2}$

2)使用掩码从数据帧中选择有效索引作为最终输出:

out = df.index[np.in1d(df['Col4'],target_array)]

这应该做到:

df.loc[df.Col4.isin(target_array)].index

编辑:

我选择了三个选项:从选择的答案中。我的,布鲁斯·普奇和迪瓦卡

enter image description here

分裂的速度要快得多。我会选他的。在

为了完整起见,我添加了两个(.query()变体)——我对400K行的计时:

In [63]: df.shape
Out[63]: (400000, 4)

In [64]:  %timeit df.index[np.in1d(df['Col4'],target_array)]
10 loops, best of 3: 35.1 ms per loop

In [65]: %timeit df.index[df.Col4.isin(target_array)]
10 loops, best of 3: 36.7 ms per loop

In [66]: %timeit df.loc[df.Col4.isin(target_array)].index
10 loops, best of 3: 47.8 ms per loop

In [67]: %timeit df.query('@target_array.tolist() == Col4')
10 loops, best of 3: 45.7 ms per loop

In [68]: %timeit df.query('@target_array in Col4')
10 loops, best of 3: 51.9 ms per loop

Here is a similar comparison for (^{}) and for different ^{}

相关问题 更多 >