从遵循特定模式的列中提取字符串

Posted

技术标签:

【中文标题】从遵循特定模式的列中提取字符串【英文标题】:Extract string from column following a specific pattern 【发布时间】:2018-10-10 22:45:15 【问题描述】:

请原谅我的熊猫新手问题,但是我有一列美国城镇和州,例如下面显示的截断版本(出于某种奇怪的原因,该列的名称称为“Alabama[edit]”列中的前 0-7 个城镇值):

0                          Auburn (Auburn University)[1]
1                 Florence (University of North Alabama)
2        Jacksonville (Jacksonville State University)[2]
3             Livingston (University of West Alabama)[2]
4               Montevallo (University of Montevallo)[2]
5                              Troy (Troy University)[2]
6      Tuscaloosa (University of Alabama, Stillman Co...
7                      Tuskegee (Tuskegee University)[5]
8                                           Alaska[edit]
9          Fairbanks (University of Alaska Fairbanks)[2]
10                                         Arizona[edit]
11            Flagstaff (Northern Arizona University)[6]
12                      Tempe (Arizona State University)
13                        Tucson (University of Arizona)
14                                        Arkansas[edit]
15     Arkadelphia (Henderson State University, Ouach...
16     Conway (Central Baptist College, Hendrix Colle...
17              Fayetteville (University of Arkansas)[7]
18              Jonesboro (Arkansas State University)[8]
19            Magnolia (Southern Arkansas University)[2]
20     Monticello (University of Arkansas at Monticel...
21            Russellville (Arkansas Tech University)[2]
22                        Searcy (Harding University)[5]
23                                      California[edit]

每个州的城镇位于每个州名的下方,例如费尔班克斯(第 9 列)是阿拉斯加州的一个城镇。

我想要做的是根据州名拆分城镇名称,这样我就有两列“州”和“地区名”,其中每个州名都与每个城镇名称相关联,如下所示:

                            RegionName                       State
0                          Auburn (Auburn University)[1]    Alabama
1                 Florence (University of North Alabama)    Alabama
2        Jacksonville (Jacksonville State University)[2]    Alabama
3             Livingston (University of West Alabama)[2]    Alabama
4               Montevallo (University of Montevallo)[2]    Alabama
5                              Troy (Troy University)[2]    Alabama
6      Tuscaloosa (University of Alabama, Stillman Co...    Alabama
7                      Tuskegee (Tuskegee University)[5]    Alabama

8         Fairbanks (University of Alaska Fairbanks)[2]     Alaska

9         Flagstaff (Northern Arizona University)[6]        Arizona
10                      Tempe (Arizona State University)    Arizona
11                        Tucson (University of Arizona)    Arizona                                              

12        Arkadelphia (Henderson State University, Ouach... Arkansas                                           

。 . 。等等。

我知道每个州名后面都有一个字符串“[edit]”,我假设我可以用它来拆分和分配城镇名称。但我不知道该怎么做。

另外,我知道我需要做很多其他数据清理工作,例如删除括号内和方括号“[]”内的字符串。这可以稍后完成...重要的部分是拆分州和城镇,并将每个城镇分配给其适当的美国。任何建议将不胜感激。

【问题讨论】:

我想看看您是如何加载这些数据的。你能显示执行此操作的代码吗? 当然。数据来自***页面:en.wikipedia.org/wiki/…。我正在使用 pd.read_table('university_towns.txt') 来读取数据(来自***页面的数据已经被格式化为 .txt 文件)。 好的,大学是您的文本文件中唯一列出的内容吗? 是的,文本文件显示州名,后跟镇名和大学(我不需要大学,我需要稍后在数据清理过程中将其删除。) 【参考方案1】:

如果没有太多上下文或无法访问您的数据,我会建议这些方面的内容。首先,修改读取数据的代码:

df = pd.read_csv(..., header=None, names=['RegionName']) 
# add header=False so as to read the first row as data

现在,使用str.extract 提取州名,这应该只提取名称,只要它们后面是子字符串“[edit]”。然后,您可以使用 ffill 向前填充所有 NaN 值。

df['State'] = df['RegionName'].str.extract(
    r'(?P<State>.*)(?=\s*\[edit\])'
).ffill()

【讨论】:

当你说设置header=False时,你的意思是header=None吗?当我尝试 header=False 时,它​​抛出了异常。 天哪!棒极了!那 str.extract 成功了!你是男人(或女人,视情况而定)!但是,在阅读正则表达式时我仍然有点绿色......我理解正则表达式来搜索'edit'字符串,但是 (?P.*)(?=\s *...) 是什么意思? @bariumdose 是的,谢谢。没有经过任何测试就写了这个,很高兴它成功了!至于正则表达式,这很容易解释。它只是指定了一个命名的捕获组(您可以在文档中查找此概念),pandas 将其转换为列名。如果您喜欢这个答案,也请考虑投票。祝你好运!

以上是关于从遵循特定模式的列中提取字符串的主要内容,如果未能解决你的问题,请参考以下文章

从一列中提取特定字符串模式

如何从python中的pandas数据框中的列中提取关键字(字符串)

从 pandas DataFrame 中的列中提取 JSON 数据

我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分

SQL 查询以查找遵循特定模式的字符串

从数据框字符串列中提取特定单词并存储在 Python 的新列中