【问题标题】:Splitting Columns' Values in Pandas by delimiter without losing delimiter通过分隔符拆分 Pandas 中的列值而不丢失分隔符
【发布时间】:2019-07-09 22:43:20
【问题描述】:

您好,我有一个遵循这种格式的数据框:

df = pd.DataFrame(np.array([[1, 2, 'Apples 20pk ABC123', 4, 5], [6, 7, 
'Oranges 40pk XYZ123', 9, 0], [5, 6, 'Bananas 20pk ABC123', 8, 9]]), columns=
               ['Serial #', 'Branch ID', 'Info', 'Value1', 'Value2'])

         Serial#  Branch ID    Info                  Value1   Value2
  0         1       2          Apples 20pk ABC123       4        5
  1         6       7          Bananas 20pk ABC123      9        0
  2         5       6          Oranges 40pk XYZ123      8        9

我想根据“pk”字符拆分“Info”列的值。本质上,我想创建两个新列,如下面的数据框中:

         Serial#  Branch ID    Package        Branch   Value1   Value2
  0         1       2          Apples 20pk    ABC123      4        5
  1         6       7          Bananas 20pk   ABC123      9        0
  2         5       6          Oranges 40pk   XYZ123      8        9

我尝试使用:

info = df["Info"].str.split("pk ", n=1, expand=True)
df['Package'] = branch[0]
df['Branch'] = branch[1]
del df['Info']

但结果是,在 df 的“Package”列中,我只得到“Apples 20”而不是“Apples 20pk”。

我想使用 " " 字符(空格)进行拆分,但是我得到了三个值('Apples'、'20pk'、'ABC123')。

因为有 n 行(不仅仅是 3 行),我想知道最有效的方法是什么?谢谢!

【问题讨论】:

    标签: python pandas split delimiter


    【解决方案1】:

    我们可以在这里使用正则表达式,并积极向后看。在这种情况下,我们在一个空格 (\s) 上进行拆分,该空格 (?<=) 前面是字符串 pk:

    df['Info'].str.split('(?<=pk)\s', expand=True)
    
                  0       1
    0   Apples 20pk  ABC123
    1  Oranges 40pk  XYZ123
    2  Bananas 20pk  ABC123
    

    为了获得您的预期输出,我们一次性创建了两列,然后删除Info:

    df[['Package', 'Branch']] = df['Info'].str.split('(?<=pk)\s', expand=True)
    
    df.drop('Info', axis=1, inplace=True)
    
      Serial # Branch ID Value1 Value2       Package  Branch
    0        1         2      4      5   Apples 20pk  ABC123
    1        6         7      9      0  Oranges 40pk  XYZ123
    2        5         6      8      9  Bananas 20pk  ABC123
    

    【讨论】:

    • 我在我的解决方案中使用了这个,但是我需要在模式之前而不是之后找到空间,(?&lt;=\[\d{4}\])\s我将如何寻找之前的空间?
    • 使用正向前瞻:\s(?=\[\d{4}\])@qbbq
    【解决方案2】:

    你能把 pk 附加到列吗?

    【讨论】:

    • 我完全考虑过这一点,我认为我可以这样做,但我也想看看是否有一个更“正确”的解决方案,遵循最佳实践和编码风格。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2021-06-14
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多