为了账号安全,请及时绑定邮箱和手机立即绑定

如何将一列分成两列?

如何将一列分成两列?

RISEBY 2019-06-25 13:33:45
如何将一列分成两列?我有一个列的数据框架,我想将它分成两列,其中一个列标题为‘fips'另一个'row'我的数据df看起来是这样的:          row0    00000 UNITED STATES1    01000 ALABAMA2    01001 Autauga County, AL3    01003 Baldwin County, AL4    01005 Barbour County, AL我不知道怎么用df.row.str[:]以实现拆分行单元格的目标。我可以用df['fips'] = hello添加新列并将其填充到hello..有什么想法吗?         fips       row0    00000 UNITED STATES1    01000 ALABAMA 2    01001 Autauga County, AL3    01003 Baldwin County, AL4    01005 Barbour County, AL
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

对于以下简单情况:

  • 我有一个带有分隔符的文本列,我想要两个列

最简单的解决办法是:

df['A'], df['B'] = df['AB'].str.split(' ', 1).str

或者,您可以为拆分的每个条目自动创建一个带有一列的DataFrame,方法如下:

df['AB'].str.split(' ', 1, expand=True)

注意,在任何一种情况下,.tolist()方法是不必要的。也不是zip().

详细情况:

安迪·海登解在展示str.extract()方法。

但是对于已知分隔符上的简单拆分(例如,用破折号拆分或用空格拆分),则.str.split()方法就足够了1..它对字符串的列(序列)进行操作,并返回列表的列(序列):

>>> import pandas as pd>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})>>> df

      AB0  A1-B11  A2-B2>>> df['AB_split'] = df['AB'].str.split('-')>>> df

      AB  AB_split0  A1-B1  [A1, B1]1  A2-B2  [A2, B2]

如果你不确定前两个参数是什么.str.split()做,我推荐给你的医生方法的普通Python版本.

但你是怎么做到的:

  • 包含两个元素列表的列。

致:

  • 两个列,每个列都包含列表的各个元素?

好吧,我们需要仔细看看.str列的属性。

它是一个神奇的对象,用于收集将列中的每个元素作为字符串处理的方法,然后尽可能有效地在每个元素中应用相应的方法:

>>> upper_lower_df = pd.DataFrame({"U": ["A", "B", "C"]})>>> upper_lower_df

   U0  A1  B2  C>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()>>> upper_lower_df

   U  L0  A  a1  B  b2  C  c

但它还有一个“索引”接口,用于通过索引获取字符串的每个元素:

>>> df['AB'].str[0]0    A1    AName: AB, dtype: object>>> df['AB'].str[1]0    11    2Name: AB, dtype: object

当然,这个索引接口.str并不真正关心它所索引的每个元素是否实际上是一个字符串,只要它可以被索引,所以:

>>> df['AB'].str.split('-', 1).str[0]0    A11    A2Name: AB, dtype: object>>> df['AB'].str.split('-', 1).str[1]0   
 B11    B2Name: AB, dtype: object

然后,简单地利用Python元组解压缩迭代来完成

>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str>>> df

      AB  AB_split   A   B0  A1-B1  [A1, B1]  A1  B11  A2-B2  [A2, B2]  A2  B2

当然,从拆分字符串列中获取DataFrame是非常有用的,因此.str.split()方法可以使用expand=True参数:

>>> df['AB'].str.split('-', 1, expand=True)

    0   10  A1  B11  A2  B2

因此,实现我们想要的另一种方法是:

>>> df = df[['AB']]>>> df

      AB0  A1-B11  A2-B2>>> df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))

      AB   A   B0  A1-B1  A1  B11  A2-B2  A2  B2


查看完整回答
反对 回复 2019-06-25
?
交互式爱情

TA贡献1712条经验 获得超3个赞

你可以的提取液使用regex模式,不同的部分非常整齐地分开:

In [11]: df.row.str.extract('(?P<fips>\d{5})((?P<state>[A-Z ]*$)|(?P<county>.*?), (?P<state_code>[A-Z]{2}$))')Out[11]: 
    fips                    1           state           county state_code0  00000       
     UNITED STATES   UNITED STATES              NaN        NaN1  01000              ALABAMA         ALABAMA  
                 NaN        NaN2  01001   Autauga County, AL             NaN   Autauga County       
                   AL3  01003   Baldwin County, AL             NaN   Baldwin County         AL4  01005  
                    Barbour County, AL             NaN   Barbour County         AL[5 rows x 5 columns]

为了解释这个稍长的正则表达式:

(?P<fips>\d{5})
  • 匹配五位数(

    \d

    )并给他们起名字

    "fips".

下一部分:

((?P<state>[A-Z ]*$)|(?P<county>.*?), (?P<state_code>[A-Z]{2}$))

也不是(|)两件事之一:

(?P<state>[A-Z ]*$)
  • 匹配任何数字(

    *

    )大写字母或空格(

    [A-Z ]

    ),并将其命名为

    "state"

    在字符串结束之前(

    $),

(?P<county>.*?), (?P<state_code>[A-Z]{2}$))
  • 匹配其他任何东西(

    .*

    )然后
  • 一个逗号和一个空格
  • 匹配两位数

    state_code

    在字符串结束之前(

    $).

在本例中:
请注意,前两行命中了“state”(将nan保留在县中和state_code列中),而最后三行则命中了县(State_Code)(将nan保留在State列中)。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 935 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信