如何在 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 布尔索引。
我有一个 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 布尔索引。