python - 如何将数据框字符串列拆分为两列?

我有一个包含一列(字符串)的数据框,我想将其拆分为两列(字符串),一列标题为 'fips',另一列为 '行'

我的数据框 df 如下所示:

          row
0    00000 UNITED STATES
1    01000 ALABAMA
2    01001 Autauga County, AL
3    01003 Baldwin County, AL
4    01005 Barbour County, AL

我不知道如何使用 df.row.str[:] 来实现拆分行单元格的目标。我可以使用 df['fips'] = hello 添加一个新列并使用 hello 填充它。有什么想法吗?

         fips       row
0    00000 UNITED STATES
1    01000 ALABAMA 
2    01001 Autauga County, AL
3    01003 Baldwin County, AL
4    01005 Barbour County, AL

最佳答案

TL;DR 版本:

对于以下简单情况:

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

最简单的解决方案是:

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

如果您的字符串具有不均匀的拆分数,并且您希望 None 替换缺失值,则必须使用 expand=True

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

详细说明:

Andy Hayden's solution最出色地展示了 str.extract() 的强大功能方法。

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

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

      AB
0  A1-B1
1  A2-B2
>>> df['AB_split'] = df['AB'].str.split('-')
>>> df

      AB  AB_split
0  A1-B1  [A1, B1]
1  A2-B2  [A2, B2]

1:如果你不确定 .str.split() 的前两个参数是做什么的, 我推荐 plain Python version of the method 的文档.

但是你怎么去:

  • 包含两个元素列表的列

到:

  • 两列,每列包含列表的相应元素?

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

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

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

   U
0  A
1  B
2  C
>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()
>>> upper_lower_df

   U  L
0  A  a
1  B  b
2  C  c

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

>>> df['AB'].str[0]

0    A
1    A
Name: AB, dtype: object

>>> df['AB'].str[1]

0    1
1    2
Name: AB, dtype: object

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

>>> df['AB'].str.split('-', 1).str[0]

0    A1
1    A2
Name: AB, dtype: object

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

0    B1
1    B2
Name: AB, dtype: object

那么,利用 Python 元组对可迭代对象进行解包就很简单了

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

      AB  AB_split   A   B
0  A1-B1  [A1, B1]  A1  B1
1  A2-B2  [A2, B2]  A2  B2

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

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

    0   1
0  A1  B1
1  A2  B2

所以,实现我们想要的另一种方法是:

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

      AB
0  A1-B1
1  A2-B2

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

      AB   A   B
0  A1-B1  A1  B1
1  A2-B2  A2  B2

expand=True 版本虽然更长,但与元组解包方法相比具有明显优势。元组拆包不能很好地处理不同长度的拆分:

>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2', 'A3-B3-C3']})
>>> df
         AB
0     A1-B1
1     A2-B2
2  A3-B3-C3
>>> df['A'], df['B'], df['C'] = df['AB'].str.split('-')
Traceback (most recent call last):
  [...]    
ValueError: Length of values does not match length of index
>>> 

但是 expand=True 通过将 None 放置在没有足够“拆分”的列中来很好地处理它:

>>> df.join(
...     df['AB'].str.split('-', expand=True).rename(
...         columns={0:'A', 1:'B', 2:'C'}
...     )
... )
         AB   A   B     C
0     A1-B1  A1  B1  None
1     A2-B2  A2  B2  None
2  A3-B3-C3  A3  B3    C3

https://stackoverflow.com/questions/14745022/

相关文章:

linux - 如何在网络上的 2 个文件夹中获取所有文件之间的差异?

python - 如何忽略 Python 中的弃用警告

python - 在 virtualenv 中设置环境变量

python - 如何在 Python 中使用省略号切片语法?

linux - 禁用 glxgears 的垂直同步

linux - 目录上次修改日期

linux - 无法连接到位于 unix :/var/run/docker. sock 的 Dock

linux - 异步 shell 命令

python - 运行 `pip install` 的 Ubuntu 给出错误 'The follo

linux - rsync 使用包含选项仅复制某些类型的文件