从遵循特定模式的列中提取字符串
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以上是关于从遵循特定模式的列中提取字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何从python中的pandas数据框中的列中提取关键字(字符串)
从 pandas DataFrame 中的列中提取 JSON 数据