Python:在没有循环的嵌套列表中快速索引字符串

数据挖掘 Python 熊猫
2022-02-10 21:48:28

我有一个数组数据集,我需要从中构建 D,它的每个元素都是字符串列表(数据集的第三列)。数据集如下所示:

600,900,3418309  
600,900,3418309  
600,900,3418314   
600,900,3418314  
600,900,3418319   
600,900,3418319  
610,800,3418324  
610,700,3418324  
600,900,3418329  
620,900,3418329  
600,900,3418329  
600,900,3418334  
610,900,3418334  
600,900,3418339  
600,900,3418339  
600,900,3418339  
660,700,3418339  
610,800,3418339  
660,700,3418339  
600,900,3418339  
600,900,3418339

我想检查每个新字符串,如果它不是任何数组元素的一部分,则仅将新字符串附加到该数组元素。由于要添加的新字符串的数据很大,我不想使用循环。有什么方法可以快速完成。我必须使用 Python。

现在我正在使用代码,这很慢:

for i in range(len(dataset)):
 for j in range(int(int(dataset[i,0]-600)),int(int(dataset[i,1]-600)+1)):
    
    if(str(dataset[i,2]) not in D[j]):
        
        D[j].append(str(dataset[i,2]))
1个回答

这个答案假设我已经正确理解了这个问题......如果 OP 用更多细节更新问题,我可以改变我的答案

使用您的示例数据,您可以使用 Pandas 轻松删除所有重复项。

设置

首先将上面的数据转储到一个包含三列的数据框中(每行中的每个项目一个。

导入熊猫:

import pandas as pd

导入您的数据 - 假设它是一个列表列表 - 您的每一行都是三个项目的列表,所以我们有三列:

df = pd.DataFrame.from_records(your_list_of_lists, columns=["col1", "col2", "col3"])

看看前 5 行:

df.head()
   col1  col2     col3
0   600   900  3418309  
1   600   900  3418309  
2   600   900  3418314  
3   600   900  3418314  
4   600   900  3418319  

默认情况下,这些值将是整数,而不是字符串(如果它们都是)。但是下面的解决方案在任何一种情况下都应该是一样的。

解决方案

如果要获取 的所有唯一值col3,可以执行以下操作之一:

uniques1 = set(df.col3)              # returns a Python set
uniques2 = df.col3.unique()          # returns a NumPy ndarray
uniques3 = df.col3.drop_duplicates() # returns a pandas Series object

如果您只想删除那些col3连续重复的行(在某些情况下,这可能会产生与上述方法相同的结果,具体取决于数据),那么您可以查看这里的方法。[一个例子]适合你的柱状情况2

def drop_consecutive_duplicates(a, col_name):      # returns the dataframe
    ...:         ar = a[col_name].values 
    ...:         return a[np.concatenate(([True],ar[:-1] != ar[1:]))]

这将返回整个数据框,其中那些连续值行被删除。

表现

还有许多其他方法可以达到相同的结果。在上述方法中,第一种方法是最快的(在您的小型数据集示例中)。以下是基准:

In [23]: %timeit df.col3.drop_duplicates()                                      
263 µs ± 883 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [24]: %timeit df.col3.unique()                                               
37.2 µs ± 3.19 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [25]: %timeit set(df.col3)                                                   
10.5 µs ± 45.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

连续版本:

In [26]: %timeit drop_consecutive_duplicates(df, "col3")                                                                                                                                                                                          
266 µs ± 3.61 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

我想 Pandas 方法可能能够更好地扩展到具有多行的 DataFrame,因此这个示例可能会偏向于只有约 20 行的虚拟数据集。

最后的方法显然有一点开销,因为它必须执行一些额外的操作