Pandas数据帧,按最后一列的最后一列拆分数据,但保留其他列

时间:2016-07-18 16:32:15

标签: python pandas dataframe

对熊猫来说很新,所以对解决方案的任何解释都表示赞赏。

我有一个数据框,例如

    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

我想将数据中的Zip State city列拆分为3个不同的列。使用这篇文章中的答案Pandas DataFrame, how do i split a column into two如果我没有第一列,我就可以完成这项任务。编写正则表达式来捕获所有公司只会导致我捕获数据中的所有内容。

我也试过

foo = lambda x: pandas.Series([i for i in reversed(x.split())])
data_pretty = data['Zip State City'].apply(foo)

但这导致我放松了公司专栏,并将多个单词的城市名称拆分为不同的列。

如何在保留公司列数据的同时拆分最后一列?

1 个答案:

答案 0 :(得分:8)

您可以使用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

来自docs

Series.str.extract(pat, flags=0, expand=None)
  

对于系列中的每个主题字符串,从第一个中提取组   正则表达式匹配。

     

版本0.13.0中的新功能。

     

参数:

     

pat :string

     

带捕获组的正则表达式模式

     

标志:int,默认为0(无标志)

     

重新模块标志,例如   re.IGNORECASE .. versionadded :: 0.18.0

     

展开:bool,默认为False

     

如果为True,则返回DataFrame。

     

如果为False,则返回Series / Index / DataFrame。

     

返回:DataFrame,每个主题字符串有一行,还有一行   每组的列。正则表达式中的任何捕获组名称   pat将用于列名;否则捕获组号   将会被使用。每个结果列的dtype总是对象,甚至   什么时候找不到匹配项。如果expand = True并且pat只有一次捕获   组,然后返回系列(如果主题是系列)或索引(如果   主题是索引)。