将正则表达式应用于迭代数据中每个项目的熊猫数据框,并仅返回第一部分

时间:2019-01-16 19:02:21

标签: python regex pandas dataframe

我有一个txt文件,其中包含州和大学的名称。我已经使用pandas.read_table()将其读入数据框。然后,我要通过iterrows()进行遍历,在每个项目上我只想获得州和大学。可以通过[edit]后缀检测状态。然后将大学排在其他行中,直到出现下一个状态。这意味着后跟“ [编辑]”的另一个名称。数据框的视图如下所示:

enter image description here

如第0行所示,阿拉巴马州为州。第1至8行的大学属于阿拉巴马州,直到出现第9行(另一州)为止。第10行属于阿拉斯加第9行的州。整个数据帧具有这种结构。我正在尝试清理它并返回具有此结构的另一个数据框:一列包含州和大学的名称,但不包括[]和()之后的部分。然后将如下所示:

阿拉巴马州

奥本

佛罗伦萨

杰克逊维尔

某些记录具有“。”或名称中的空白。我写了以下正则表达式来获取它们,但结果也给了我“编辑”,“奥本大学”等信息。换句话说,它返回的是所有匹配的内容,而不仅仅是第一部分。

代码如下:我已经将txt文件读入一个名为df_university_town的数据帧中。然后,我将正则表达式应用如下:

import re
pattern = re.compile(r'([a-zA-Z]+[\.\s]?[a-zA-Z]+)(\w?)')
for key, item in df_university_town.iteritems():
    matches = pattern.finditer(str(item))
    for match in matches:
        print(match.group(1))

这就是我得到的结果:

enter image description here

如您所见,最终结果中的“编辑”和“奥本大学”是多余的。我使用了不同的方法并尝试了match(),但这也没有帮助。基本上,当我到达“ [”或“(”时,不应继续搜索。我不知道我还需要做什么。感谢您的帮助或建议。

非常感谢您的帮助以及投入的时间。

2 个答案:

答案 0 :(得分:2)

如果您需要抓住这些字符之前的所有内容,请使用.str.split。正则表达式允许在([之前使用可选的空白字符,因此您以后无需去除它。

df.RegStatName.str.split('(\s?\(|\s?\[)').str[0]

0      Alabama
1       Auburn
2     Florence
3       Alaska
4    Fairbanks
5      Arizona
6      Nothing
7         This
Name: RegStatName, dtype: object

样本数据:df

                                     RegStatName
0                                  Alabama[edit]
1                  Auburn (Auburn University)[1]
2         Florence (University of NOrth Alabama)
3                                   Alaska[edit]
4  Fairbanks (University of Alaska Fairbanks)[2]
5                                  Arizona[edit]
6                                        Nothing
7                               This [something]

答案 1 :(得分:1)

您可以尝试一下:

([^\(\)\[\]\n\r]+)(?![^\[\(]*?[\]\)])

它看起来确实很简单,但是似乎可以与您的样本集一起使用,如您在此处看到的: https://regex101.com/r/jBSeqQ/2

如果您想分别提供大学名称,请在下面的评论中提及:)