Python 按照特定模式从列中提取字符串
请原谅我的熊猫新手问题,但我有一列美国城镇和州,如下图所示的截断版本(出于某种奇怪的原因,该列的名称称为“Alabama[edit]”,与该列中的前0-7个城镇值关联): 每个州的城镇位于每个州名称的下方,例如,费尔班克斯(列值9)是阿拉斯加州的城镇 我想做的是根据州名称划分城镇名称,这样我有两列“state”和“RegionName”,其中每个州名称与每个城镇名称关联,如下所示:Python 按照特定模式从列中提取字符串,python,string,pandas,dataframe,split,Python,String,Pandas,Dataframe,Split,请原谅我的熊猫新手问题,但我有一列美国城镇和州,如下图所示的截断版本(出于某种奇怪的原因,该列的名称称为“Alabama[edit]”,与该列中的前0-7个城镇值关联): 每个州的城镇位于每个州名称的下方,例如,费尔班克斯(列值9)是阿拉斯加州的城镇 我想做的是根据州名称划分城镇名称,这样我有两列“state”和“RegionName”,其中每个州名称与每个城镇名称关联,如下所示: RegionName
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]”,我想我可以用它来分割和分配城镇名称。但我不知道怎么做
另外,我知道我还需要做很多其他的数据清理,比如删除括号内和括号“[]”内的字符串。这可以稍后再做……重要的部分是将各州和城镇分开,并将每个城镇分配到适当的美国。任何建议都将不胜感激。如果没有太多上下文或访问您的数据,我建议您按照这些思路做些事情。首先,修改读取数据的代码:
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()
df['State']=df['RegionName'].str.extract(
r'(?P.*)(?=\s*\[编辑\])”
).ffill()
我想看看您是如何加载这些数据的。你能给我看一下代码吗?当然可以。数据来自维基百科页面:。我正在使用pd.read_table('university_towns.txt')来读取数据(维基百科页面中的数据已经格式化为.txt文件)。好的,那么您的文本文件中是否只列出了大学?是的,文本文件显示了州名,后跟城镇名称和大学(我不需要大学,我需要在以后的数据清理过程中消除大学。)当你说设置header=False时,你的意思是header=None吗?当我尝试header=False时,它抛出了一个异常。天哪!太神奇了!str.extract成功了!你就是男人(或女人,视情况而定)!但是,在阅读正则表达式时,我还是有点生疏…我理解正则表达式搜索“”字符串,但是(?P.*)(?=\s*…)是什么意思?@bariumdose是的,谢谢。写这篇文章时没有进行任何测试,很高兴它起作用了!至于正则表达式,这很容易解释。它只是指定了一个命名的捕获组(你可以在DOC上查看这个概念),熊猫把它翻译成列名。如果你喜欢答案,也要考虑把它投上去。祝你好运!
df['State'] = df['RegionName'].str.extract(
r'(?P<State>.*)(?=\s*\[edit\])'
).ffill()