Python 如何在DataFrame中找到与正则表达式匹配的实际唯一值
我有一个超过一百万行的pandas数据框,在尝试规范化数据的过程中,我需要找到所有唯一的值(对于给定的列)。给定列中的数据是字符串类型-表示城市名称-我已经在规范化数据方面走了很长一段路,通过采取某些步骤,如降低列中所有值的大小写、条带化和使用Python 如何在DataFrame中找到与正则表达式匹配的实际唯一值,python,regex,pandas,normalization,Python,Regex,Pandas,Normalization,我有一个超过一百万行的pandas数据框,在尝试规范化数据的过程中,我需要找到所有唯一的值(对于给定的列)。给定列中的数据是字符串类型-表示城市名称-我已经在规范化数据方面走了很长一段路,通过采取某些步骤,如降低列中所有值的大小写、条带化和使用pandas.core.frame.DataFrame.replace(),使用对数据来说似乎显而易见的正则表达式 以下是我所拥有(以及我想要实现)的一个示例: In [1018]: sample Out[1018]: 0 0 wa
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表达式搜索不同城市名称的变化,以便找到数据集版本中的所有现有数据,并继续进行归一化
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列中的唯一值。解决方法是
提取
值
对于这个问题,如上所述,我使用了str.extract()
而不是str.contains()
可能有更好的解决方案,但这肯定是一个。使用布尔索引——请参阅
如果存在空值,请执行以下操作:
df[pd.notnull(df.column_a) & df.column_a.str.contains(r'\bwar.*')]
这将是一个巨大的痛苦在a$$,你必须降低大小写,标准化拼写,计算某种相似性,如levenshtein或jaccard,但最重要的是你有不同语言的条目!!如果您可以访问某种字典,那么您可以将这些条目映射到同一个根单词,并将它们标准化。我想,使用regex实际执行所有这些操作会非常慢。@n1c9运行
df.column\u a=df.column\u a.str.lower()
和df.column\u a=df.column\u a.str.strip()
实际上非常快。无论如何,我只需要做一次,对解决方案的长期性能不感兴趣。@EdChum是的,数据需要认真清理,你说得对。如果我有一个正则表达式返回的实际值,我将能够更快地移动,运行类似于:pattern=r“^..*\b(?Pwarsaw)\b.*$”
,replace_with=r“\1”
,然后df.replace({column_:pattern},{column_:replace_with},regex=True,inplace True)
感谢您的帮助。谢谢!我在尝试时出错:ValueError:无法使用包含NA/NaN值的向量进行索引
。我想我应该尝试用空字符串或类似的字符串替换所有NaN值
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.*')]