【问题标题】:Python Pandas: Split column and add new column next to current [duplicate]Python Pandas:拆分列并在当前[重复]旁边添加新列
【发布时间】:2022-02-04 17:48:45
【问题描述】:

我有一个与此类似的 Excel 表格,但列更多:

Team Members
Team1 (553) 95435
Team2 (443) 872

我想将团队列拆分为团队和一个名为团队 ID 的新列。我目前使用以下代码执行此操作:

df[['Team', 'Team ID']] = df['Team'].str.split(r"\s\(+(?=\S*$)", expand=True)
df['Team ID'] = df['Team ID'].str[:-1]

这很好用(请注意,团队名称可以包含数字、空格和括号)。所以虽然这可能并不完美,但我完成了工作。

我的问题是新列“团队 ID”位于数据集的末尾。所以它将是“团队 - 成员 - 团队 ID”。虽然 3 列不是问题,但有时有 10 列需要拆分 7 列。

那么问题来了:有没有办法将一列分成 2 列,并将新创建的列放在旧列旁边?

【问题讨论】:

  • @jezrael 不确定这是不是骗子,可以直接在正确的位置插入
  • @mozway - 我认为使用列名列表以正确方式进行最后排序。
  • 或者使用df.insert(df.columns.get_loc('Team')+1, 'Team ID', df.pop('Team ID'))应该可以工作

标签: python pandas


【解决方案1】:

您可以将str.extract 与正则表达式一起使用。

要插入正确的位置,您可以使用insert:

out = df['Team'].str.extract('(\w+) \((\d+)\)')

df['Team'] = out[0]
df.insert(df.columns.get_loc('Team')+1, 'Team ID', out[1])

输出:

    Team  Team ID  Members
0  Team1      553    95435
1  Team2      443      872

正则表达式:

(\w+)      # match word
\((\d+)\)  # match digits surrounded by parentheses

【讨论】:

  • 如果团队名称是“Team1 (Boston)”,该正则表达式将如何工作?甚至是“Team1 (99)”后跟 ID?
  • 您能否提供详尽的全名示例?如果您最初真的想匹配任何内容并且知道 ID 是最后一件事,请使用锚点 '(.*) \((\d+)\)$'
  • 团队可能过于简化。字符串的示例可以是“BE-AMZ-V34489-Ford Motors (58837)-Web-Standard-New product range (Demo name) (12345679)”。但是 ID 总是在最后,在括号中,在空格之后。您的最后一个正则表达式似乎工作正常。谢谢。您在旧列旁边添加新列的解决方案也有效。再次感谢!
  • 抱歉又带回来了,但是用了一段时间后,出现了问题。在极少数情况下,字符串中不存在 ID,例如没有为“团队”指定名称,因此名称只是数据框中的字符串“NoName”(没有 ID)。使用此设置,团队和团队 ID 列都将返回空白。有什么方法可以将团队列保持为“NoName”? (或将 Team 和 Team ID 都设置为“NoName”)
  • 也许用一个可重复的例子打开一个新问题?
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2023-03-26
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多