Jst*_*uff 3 python dataframe pandas
对熊猫来说很新,所以对解决方案的任何解释都表示赞赏.
我有一个数据帧,如
Company Zip State City
1 *CBRE San Diego, CA 92101
4 1908 Brands Boulder, CO 80301
7 1st Infantry Division Headquarters Fort Riley, KS
10 21st Century Healthcare, Inc. Tempe 85282
15 AAA Jefferson City, MO 65101-9564
Run Code Online (Sandbox Code Playgroud)
我想将我的数据中的Zip State city列拆分为3个不同的列.使用这篇文章Pandas DataFrame的答案,如何将一个列拆分为两个如果我没有第一列,我可以完成此任务.编写正则表达式来捕获所有公司只会导致我捕获数据中的所有内容.
我也试过了
foo = lambda x: pandas.Series([i for i in reversed(x.split())])
data_pretty = data['Zip State City'].apply(foo)
Run Code Online (Sandbox Code Playgroud)
但这导致我松开公司列并将多个单词的城市名称拆分为不同的列.
如何在保留公司列数据的同时拆分我的最后一列?
你可以使用extract()方法:
In [110]: df
Out[110]:
Company Zip State City
1 *CBRE San Diego, CA 92101
4 1908 Brands Boulder, CO 80301
7 1st Infantry Division Headquarters Fort Riley, KS
10 21st Century Healthcare, Inc. Tempe 85282
15 AAA Jefferson City, MO 65101-9564
In [112]: df[['City','State','ZIP']] = df['Zip State City'].str.extract(r'([^,\d]+)?[,]*\s*([A-Z]{2})?\s*([\d\-]{4,11})?', expand=True)
In [113]: df
Out[113]:
Company Zip State City City State ZIP
1 *CBRE San Diego, CA 92101 San Diego CA 92101
4 1908 Brands Boulder, CO 80301 Boulder CO 80301
7 1st Infantry Division Headquarters Fort Riley, KS Fort Riley KS NaN
10 21st Century Healthcare, Inc. Tempe 85282 Tempe NaN 85282
15 AAA Jefferson City, MO 65101-9564 Jefferson City MO 65101-9564
Run Code Online (Sandbox Code Playgroud)
来自docs:
Series.str.extract(pat, flags=0, expand=None)
Run Code Online (Sandbox Code Playgroud)
对于系列中的每个主题字符串,从正则表达式pat的第一个匹配中提取组.
版本0.13.0中的新功能.
参数:
pat:字符串
具有捕获组的正则表达式模式
flags:int,默认为0(无标志)
re模块标志,例如re.IGNORECASE .. versionadded :: 0.18.0
expand:bool,默认为False
如果为True,则返回DataFrame.
如果为False,则返回Series/Index/DataFrame.
返回:DataFrame,每个主题字符串有一行,每个组有一列.正则表达式pat中的任何捕获组名称都将用于列名称; 否则将使用捕获组编号.即使找不到匹配项,每个结果列的dtype也始终为object.如果expand = True且pat只有一个捕获组,则返回Series(如果subject是Series)或Index(如果subject是index).