删除文本字符串中破折号周围的前导和尾随空白,然后将文本拆分为 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
假设 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