在pandas框架列中查找数组元素位置(aka pd.series)

Del*_*ari 9 python arrays indexing numpy pandas

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

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
Run Code Online (Sandbox Code Playgroud)

给定一系列目标:

target_array = np.array(['AAA', 'CCC', 'EEE'])
Run Code Online (Sandbox Code Playgroud)

我想找到Col4其中也出现的单元格元素索引target_array.

我试图找到一个记录在案的答案,但这似乎超出了我的技能......任何人都有任何建议吗?

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

编辑1:

非常感谢你们所有的回复.可悲的是,我只能选择一个,但每个人似乎都认为@Divakar是最好的.仍然应该看看piRSquared和MaxU速度比较所有可能的可能性

Div*_*kar 10

你可以用NumPy's in1d-

df.index[np.in1d(df['Col4'],target_array)]
Run Code Online (Sandbox Code Playgroud)

说明

1)创建一个1D对应于每一行的掩码,告诉我们col4's元素和任何元素之间是否匹配target_array:

mask = np.in1d(df['Col4'],target_array)
Run Code Online (Sandbox Code Playgroud)

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

out = df.index[np.in1d(df['Col4'],target_array)]
Run Code Online (Sandbox Code Playgroud)


piR*_*red 9

这应该这样做:

df.loc[df.Col4.isin(target_array)].index
Run Code Online (Sandbox Code Playgroud)

编辑:

我选择了三个选项:来自选定的答案.我的,布鲁斯普奇和迪瓦卡

在此输入图像描述

Divakars的速度更快.我会选他的.


Max*_*axU 7

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

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
Run Code Online (Sandbox Code Playgroud)

这是(not in ...)和不同的类似比较dtypes


Jef*_*eff 5

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']}
target_array = np.array(['AAA', 'CCC', 'EEE'])

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

df['in_col'] = df['Col4'].apply(lambda x: x in target_array)
Run Code Online (Sandbox Code Playgroud)

这是你在找什么?然后,您可以分组新列并查询True元素.