通过另一个列值将列拆分为多列(复杂的分隔符)

Split column to multiple columns by another column value (complicated separator)

  1. 我有这样的数据框:
df = pd.DataFrame(np.array([['abc 33 aaa 9g98f 333', 'aaa'],
                            ['cde aaa 95fwf', 'aaa'],
                            ['12 faf bbb 92gcs', 'bbb'],
                            ['faf bbb 7t87f', 'bbb']]),
                            columns=['column1', 'column2'])

column1 值的 len 可能不同 - 从 2 到 5 个单词,所以用 space 拆分不是一个选项。

            column1     column2
0  abc 33 aaa 9g98f 333   aaa
1     cde aaa 95fwf       aaa
2  12 faf bbb 92gcs       bbb
3     faf bbb 7t87f       bbb

  1. 输出应该是这样的:
            column1 new_column1 new_column2      column2
0  abc 33 aaa 9g98f      abc 33       9g98f 333     aaa
1     cde aaa 95fwf         cde       95fwf         aaa
2     faf bbb 92gcs         faf       92gcs         bbb
3  12 faf bbb 7t87f      12 faf       7t87f         bbb

那个主题 - How to split a dataframe string column into two columns? - 没有帮助,因为分隔符

更新。左边的“边”可能有 2-5 个词 - 右边也有。

不确定您的意思,用 space 分割不是一个选项,您能举个例子吗?正如我所见,您想要实现的逻辑如下:新列应该包含最后一个 space 之后的最后一部分,而另一列应该包含其余部分,对吗? 如果那是重现您的输出的假设:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([['abc 33 aaa 9g98f', 'aaa'], ['cde aaa 95fwf', 'aaa'], ['12 faf bbb 92gcs', 'bbb'], ['faf bbb 7t87f', 'bbb']]), columns=['column1', 'column2'])


df["new_column1"] = [ ' '.join(s.split(' ')[:-2]) for s in df["column1"].values ]
df["new_column2"] = [ s.split(' ')[-1] for s in df["column1"].values ]

OK:根据更新的问题,这是我现在的理解:

df[["new_column1","new_column2"]] =  [ a.split(b) for a,b in df[["column1","column2"]].values ]

选项 1

在空格上拆分 是一个选项,如果最后两列只有一个单词。使用 rsplit:

df['column1'].str.rsplit(n=2, expand=True)

输出:

        0    1      2
0  abc 33  aaa  9g98f
1     cde  aaa  95fwf
2  12 faf  bbb  92gcs
3     faf  bbb  7t87f

注意。这不适用于更新的示例

选项 2

或者,根据提供的分隔符拆分:

df[['new_column1', 'new_column2']] = [a.split(f' {b} ') for a,b in
                                      zip(df['column1'], df['column2'])]

输出:

                column1 column2 new_column1 new_column2
0  abc 33 aaa 9g98f 333     aaa      abc 33   9g98f 333
1         cde aaa 95fwf     aaa         cde       95fwf
2      12 faf bbb 92gcs     bbb      12 faf       92gcs
3         faf bbb 7t87f     bbb         faf       7t87f

选项 3

最后,如果您有很多次相同的分隔符和很多行,则可能值得使用每组矢量拆分:

(df
 .groupby('column2')
 .apply(lambda g: g['column1'].str.split(f'\s*{g.name}\s*', expand=True)) 
)

输出:

        0          1
0  abc 33  9g98f 333
1     cde      95fwf
2  12 faf      92gcs
3     faf      7t87f