【问题标题】:pandas split based on sep=' ' not workingpandas 根据 sep=' ' 拆分不工作
【发布时间】:2020-09-03 22:03:22
【问题描述】:

我有一个正在使用的文本文件,它用空格而不是逗号分隔。我已经完成了其中的一些,总是创建一个长行,然后在需要的地方拆分为列。数据一直排到现在,我遇到了障碍。下面我有一些示例文本的数据框。

我正在尝试做的事情:

  1. 从系列中的 (0,Test) 开始。努力工作。
  2. 检查 (0,Test) 处的元素是否有第一个位置 (0) 的数字或字母 细绳。 如果数字存在,跳过或什么也不做。 如果存在字母,则需要在第一个空格出现时拆分代码: df[['First Name', 'Test']] = df['Test'].str.split(" ", 1, expand=True) 和 从“测试”列中删除名字并将其放在“名字”列中。
  3. 向下移动到下一行并重复,直到完成系列。
  4. (奖励):中间名首字母可以跟在名字后面(第 1 行)。如果可能的话 这也能被捕获吗?

代码

import pandas as pd
from pandas import DataFrame, Series

list = {'Test': ['9/21/2019 1 9/29/2019',
                 'Cynthia T. CC 9/21/2016 1 9/30/2019',
                 '9/12/2019 1 9/12/2012',
                 'Hannah A/R 9/20/2015 1 9/07/2016',
                 'John CC 9/26/2019 3 9/29/2019']}

df = pd.DataFrame(list)

# for n in df.Test:
#     if n[0].isalpha:
#         df[['First Name', 'Test']] = df['Test'].str.split(" ", 1, 
           expand=True)
#     else:
#         continue

print(df)

#----------------------------
# Currently:
#    Test
# 0  9/21/2019 1 9/29/2019
# 1  Cynthia T. CC 9/21/2016 1 9/30/2019
# 2  9/12/2019 1 9/12/2012
# 3  Hannah A/R 9/20/2015 1 9/07/2016
# 4  John CC 9/26/2019 3 9/29/2019

# What I would like:
#    Test                                                 First Name
# 0  9/21/2019 1 9/29/2019                                NaN
# 1  CC 9/21/2016 1 9/30/2019                             Cynthia T.
# 2  9/12/2019 1 9/12/2012                                NaN
# 3  A/R 9/20/2015 1 9/07/2016                            Hannah
# 4  CC 9/26/2019 3 9/29/2019                             John

我们一如既往地感谢您的时间和知识。感谢您的帮助。

【问题讨论】:

  • 如果您提供文件中文本的(未截断的)示例,我们可以提供帮助
  • 另外,请让问题更简洁:)。我们只需要输入和预期输出
  • Anon01,上面的数据框是我正在使用的示例。此外,粘贴在 REM'd out 的代码底部的是当前正在显示的内容以及我想要显示的内容。就问题而言。如果 string[0] isalpha 然后执行 .str.split(" ", 1, expand=True) 并删除第一个名称并将其放在新列中,有没有办法通过一系列循环。就像上面的例子。如果您还有其他问题,请告诉我。
  • 很难理解你想要什么。我会看看你是否可以让问题更简洁
  • 很抱歉给您带来了困惑。我会编辑。

标签: python pandas split


【解决方案1】:

您可以使用 pandas 字符串访问器进行拆分(并检查 alpha)。

# split and get the first name
df['First Name'] = df['Test'].str.split(n=1).str[0]

# filter out numerics
df['First Name'] = df['First Name'].where(df['First Name'].str.isalpha())

输出

                                  Test First Name
0                9/21/2019 1 9/29/2019        NaN
1  Cynthia T. CC 9/21/2016 1 9/30/2019    Cynthia
2                9/12/2019 1 9/12/2012        NaN
3     Hannah A/R 9/20/2015 1 9/07/2016     Hannah
4        John CC 9/26/2019 3 9/29/2019       John

【讨论】:

  • 您好 RichieV,感谢您对此进行调查。有一件事, split 方法不应该从 ['Test'] 列中删除名字(在这种情况下)吗?这可以在您的代码中使用吗?
  • 这几乎是我所需要的,我唯一可能遇到的其他问题是看第 4 步。一些字符串包含带句点的中间首字母。第 1 行上的示例:Cynthia T。您的代码可以处理这些类型的字符串吗?
  • 是的,将所有内容保留在事件的右侧。我有很长的代码行,我一次提取一个事件并放入一个新列中......希望这是有道理的。
  • First name 设为Cynthia T. 并将Test 设为CC 9/21/2016... ?
  • 是的...看起来不错。一些中间声母在声母后面有句号,有些则没有。如果留下了这个时期,我可以在这个时期上做一个 lstrip 我认为删除。
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多