[英]Split text in a column into three columns
这个问题是Pietro关于如何将一列拆分为多列的奇妙答案的后续措施。 我的目标是从现有数据框中获取一列,将其拆分到一个空间上,然后获取前三个/四个拆分值,并将每个值放置在特定的列中,而忽略其余部分。
此拆分的问题在于,行之间的空格数有所不同。 有时数据显示为“ Fort Lee NJ 07024”。 在其他时间,它看起来像“ NY NY 10000”。 我不确定是否有简单的解决方法。
df['City, State, Zip'].str.split()
# Returns a variable length row.
# I need to take the first three or four values, and add them to columns: City/State/Zip
假设状态和邮政编码始终存在并且包含有效数据,则解决此问题的一种方法是首先拆分字符串。 state和zip分别只是倒数第二和最后一列。 我已经使用列表city_state_zip
从city_state_zip
提取它们。 为了提取城市,我使用了嵌套列表推导和join
。 最后两个元素是州和邮政编码,因此列表的长度减去两个就可以告诉您城市名称中包含多少个元素。 然后,您只需要将它们加入一个空格即可。
df = pd.DataFrame({'city_state_zip': ['Fort Lee NJ 07024',
'NY NY 10000',
'Carmel by the Sea CA 93922']})
city_state_zip = df.city_state_zip.apply(lambda x: x.split())
df['city'] = [" ".join([x[c] for c in range(len(x) - 2)]) for x in city_state_zip]
df['state'] = [x[-2] for x in city_state_zip]
df['zip'] = [x[-1] for x in city_state_zip]
>>> df
city_state_zip city state zip
0 Fort Lee NJ 07024 Fort Lee NJ 07024
1 NY NY 10000 NY NY 10000
2 Carmel by the Sea CA 93922 Carmel by the Sea CA 93922
编辑:根据DSM的建议,看起来最后两个字是邮政编码的状态,在这种情况下,您可以
df = pd.DataFrame({'city_state_zip': ['Fort Lee NJ 07024',
'NY NY 10000',
'Carmel by the Sea CA 93922']})
In [50]: regex = '(?P<City>[a-zA-z ]*) (?P<State>[A-Z]{2}) (?P<Zip>[\d-]*)'
df.city_state_zip.str.extract(regex)
Out[50]:
City State Zip
0 Fort Lee NJ 07024
1 NY NY 10000
2 Carmel by the Sea CA 93922
此方法使用正则表达式使用多个命名组进行提取,每个命名组分别对应于City,State和Zip。 如图所示,提取方法的结果是一个具有3列的数据框。 组的语法是用括号将每个组的正则表达式括起来。 要命名组,请在组正则表达式前的括号中插入?P<group name>
。 此解决方案假定城市名称仅包含大小写字母,空格和统计缩写。 恰好包含2个大写字母,但如果不是这种情况,则可以对其进行调整。 请注意,这里的正则表达式中各组之间的空格很重要,因为它们代表城市,州和邮编之间的空格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.