此问题是关于如何将列拆分为多列的Pietro's fantastic answer的后续问题。我的目标是从现有数据框中取一列,将其拆分到一个空格中,然后取出前三个/四个拆分值,并将每个值放在一个特定的列中,忽略余数。
此拆分的问题在于行之间的空白数量不同。有时数据看起来像“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
答案 0 :(得分:1)
假设状态和zip始终存在且包含有效数据,解决此问题的一种方法是首先拆分字符串。 state和zip分别是倒数第二列和最后一列。我使用列表推导从city_state_zip
中提取它们。为了提取城市,我使用了嵌套列表理解和join
。最后两个元素是state和zip,因此列表的长度减去2会告诉您城市名称中包含多少元素。然后你只需要用空格加入它们。
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
答案 1 :(得分:1)
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个大写字母,但如果不是这样,你可以调整它。请注意,正则表达式中组之间的空格在这里很重要,因为它们代表城市,州和邮政编码之间的空格。