如何在 pandas DataFrame 中找到与正则表达式匹配的实际唯一值

How to find actual unique values in pandas DataFrame that match a regex

我有一个 pandas DataFrame 超过一百万行,我需要在尝试规范化数据的过程中找到所有唯一值(对于给定列)。给定列中的数据是字符串类型 - 代表城市名称 - 我已经在标准化数据方面取得了很大进展,通过采取某些步骤将列中的所有值小写,条带化和使用 pandas.core.frame.DataFrame.replace()使用对数据而言显而易见的正则表达式。

下面是我所拥有的(以及我想要实现的)示例:

In [1018]: sample
Out[1018]: 
       0
0     warsaw   ## -> warsaw
1     krakow   ## -> krakow
2   warszawa   ## -> warsaw
3   cracovie   ## -> krakow
4    warsawa   ## -> warsaw
5      krkow   ## -> krakow
6     krąków   ## -> krakow
7   krakowie   ## -> krakow
8     kraków   ## -> krakow
9   varşovia   ## -> warsaw
10  warschau   ## -> warsaw

只有比这大得多的数据集,因此我需要使用正则表达式搜索不同城市名称的变体,以便找到数据集版本中的所有现有版本并继续规范化。

In [1023]: df.column_a.unique()
Out[1023]: 
array(['warsaw', 'bydgoszcz', 'null', ..., 'kłodawa', 'kościelna wieś',
   'poznań-jeżyce'], dtype=object)

In [1024]: len(df.column_a.unique())
Out[1024]: 3798

我试过 .str.contains() 但我只得到了那些索引的布尔值 - 在定义的列下 - 与给定正则表达式匹配的值:

In [1029]: df.column_a.str.contains(r"\bwar.*")
Out[1029]: 
0       True
1      False
2      False
3       True
4      False
5      False
6      False
7      False
8      False
9      False
10     False
   ...  

但是,我正在寻找的是获取与给定正则表达式匹配的实际值。对于上面的例子,我希望能够得到类似的东西:

['warsaw','warszawa','warsawa','warschau']

我现在找到了一种方法来 运行 搜索 DataFrame 列中的 return 唯一值。解决方案是 extract 值。

对于问题,如上所述,我使用了str.extract()而不是str.contains()

In [1311]: df.column_a.str.extract(r"\b(war.*)").unique()
Out[1311]: 
array(['warsaw', nan, 'waraszawa', 'warszawskiej', 'warszawy', 'warzawa',
   'warsza', 'warrszawa', 'warzszawa', 'warszawan', 'warszawie',
   'warwszawa', 'warszawski', 'warzno 84-208', 'warasza, wola',
   'warszawskie', 'warzsawa', 'warzno', 'warszawa', 'warszwa', 'warsawa'], dtype=object)

可能有更好的解决方案,但这个确实是一个。

使用布尔索引--参考document

   In [143] df[df.column_a.str.contains(r'\bwar.*')]
   Out [143]
   0     warsaw
   2   warszawa
   4    warsawa
   10  warschau

如果有空值,则执行此操作:

df[pd.notnull(df.column_a) & df.column_a.str.contains(r'\bwar.*')]

对于类似问题,我受到了这里许多回复的启发,这是我的方法。

对我来说,我无法让 .str.contains().unique() 接近工作,所以这是我的替代方案。

我们使用通过布尔索引子集化的技术组合,从 str.contains 中删除 NaN 值,删除重复值并最终导出到列表

df[df["column_a"].str.contains(r"\bwar.*", na=False)]['column_a'].drop_duplicates().tolist()

我还提取了特定列,假设对于其他 post 视图,它们的数据框可能包含超过 1 列,post 布尔索引。