通过另一个列值将列拆分为多列(复杂的分隔符)
Split column to multiple columns by another column value (complicated separator)
- 我有这样的数据框:
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
- 输出应该是这样的:
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
- 我有这样的数据框:
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
- 输出应该是这样的:
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