删除文本字符串中破折号周围的前导和尾随空白,然后将文本拆分为 pandas 的多列的有效方法

efficient way of removing leading and trailing whitepaces around dash in text strings and then splitting the text into multiple columns of pandas

假设 pandas 数据框包含以下内容:

 import pandas as pd
 df = pd.DataFrame({'text': ['ABC - XYZ- Some Text', 'DEF- XYZ -sometext', 'GHI -XYZ - sometext', 'JKL-XYZ- sometext', 'MNO1- XYZ- some text', 'MNO2 - XYZ - some text', 'MNO3 - XYZ-some text', 'MNO4-XYZ -some text', 'MNO5- XYZ-sometext -someother text', 'MNO6 -XYZ -sometext-someother text']})

我想要做的就是删除 'only' 破折号周围的前导空格和训练空格,然后将数据拆分为新数据框的新(多个)列。这样新的数据框应该是这样的:

 Col1    Col2    Col3           Col4                Col5    Col6 ....
 ABC     XYZ     Some Text     none                 none    none
 DEF     XYZ     sometext     none                  none    none
 GHI     XYZ     sometext     none                  none    none
 JKL     XYZ     sometext     none                  none    none
 .
 .
 MNO6    XYZ     sometext       someother text      none    none

基本上取决于破折号的最大数量,新数据框中将有列(例如,如果它是 6 个破折号,那么将有 6 列)and 没有值的地方拆分后的列,将有 none 个值。

现在,我正在尝试做这样的事情:

df1 = df['text'].str.split(' - ', n=2, expand=True)
df1.columns = ['Col_1_{}'.format(x+1) for x in df1.columns]

and then 

df2 = df1['Col_1_1'].str.split('- ', n=1, expand=True)
df2.columns = ['Col_1_1_{}'.format(x+1) for x in df2.columns]

等等,以便稍后我可以合并所有这些列并重命名它们。

但这似乎效率不高,抱歉,我不是专业人士python :'(

有没有一种有效的方法可以达到我想要的结果?如有任何建议,我们将不胜感激。

您可以使用

df['text'].str.split(r'\s*[—–-]\s*', expand=True)

\s*[—–-]\s* 匹配任何连字符、en- 或 em-dash 及其左右两侧的任何零个或多个空白字符。

expand=True 将使它输出一个数据帧。

查看Pandas测试:

import pandas as pd
df = pd.DataFrame({'text': ['ABC - XYZ- Some Text', 'DEF- XYZ -sometext', 'GHI -XYZ - sometext', 'JKL-XYZ- sometext', 'MNO1- XYZ- some text', 'MNO2 - XYZ - some text', 'MNO3 - XYZ-some text', 'MNO4-XYZ -some text', 'MNO5- XYZ-sometext -someother text', 'MNO6 -XYZ -sometext-someother text']})
df1 = df['text'].str.split(r'\s*[—–-]\s*', expand=True)
df1.columns = ['Col{}'.format(x+1) for x in df1.columns]

>>> df1
   Col1 Col2       Col3            Col4
0   ABC  XYZ  Some Text            None
1   DEF  XYZ   sometext            None
2   GHI  XYZ   sometext            None
3   JKL  XYZ   sometext            None
4  MNO1  XYZ  some text            None
5  MNO2  XYZ  some text            None
6  MNO3  XYZ  some text            None
7  MNO4  XYZ  some text            None
8  MNO5  XYZ   sometext  someother text
9  MNO6  XYZ   sometext  someother text