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)
这应该这样做:
df.loc[df.Col4.isin(target_array)].index
Run Code Online (Sandbox Code Playgroud)
编辑:
我选择了三个选项:来自选定的答案.我的,布鲁斯普奇和迪瓦卡
Divakars的速度更快.我会选他的.
为了完整起见,我添加了两个(.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)
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元素.