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

2024-10-01 19:28:44 发布

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

我有一个超过一百万行的pandas数据帧,我需要在尝试使数据正常化的过程中找到所有唯一的值(对于给定的列)。给定列中的数据是string类型的-表示城市名称-我已经在规范化数据方面走了很长的路,通过采取某些步骤将列中的所有值都小写,分条并使用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

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

^{pr2}$

我尝试过使用.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']

Tags: 数据in名称falsetruepandasout例子
2条回答

使用布尔索引引用document

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

如果有空值,请执行以下操作:

^{pr2}$

我现在找到了一种方法来运行搜索,以返回数据帧列中的唯一值。解决方案是extract取而代之的是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)

也许有更好的解决办法,但这一个肯定是一个。在

相关问题 更多 >

    热门问题