用数组填充的 Pandas 列,连接数组内的值
Posted
技术标签:
【中文标题】用数组填充的 Pandas 列,连接数组内的值【英文标题】:Pandas column filled with arrays, concatenate values inside arrays 【发布时间】:2021-02-18 11:03:34 【问题描述】:我有一个带有标记化单词的数据框,以及另一个带有这些单词的去标记化版本的数据框。我需要对单词进行去标记化,以便我可以合并两个数据框。 我尝试使用 join 和其他方法,但它似乎不起作用:
这是带有标记值的原始数据框
0 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'c', '2', '...
1 ['[CLS]', 'C', 'O', 'c', '1', 'c', 'c', 'c', '...
2 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'N', 'C', '...
3 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'c', '2', '...
4 ['[CLS]', 'C', 'C', 'C', 'c', '1', 'n', 'c', '...
...
5024 ['[CLS]', 'C', 'c', '1', 'c', 'c', '(', 'I', '...
5025 ['[CLS]', 'C', 'C', 'O', 'c', '1', 'c', 'c', '...
5026 ['[CLS]', 'C', 'O', 'c', '1', 'c', 'n', 'c', '...
5027 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'N', 'C', '...
5028 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'N', 'C', '...
我希望将每一行连接起来,这样每一行看起来都像这样的化合物
ex : 0 cc1coN[@@305]
我试过了
b = df['tokens']
b = pd.DataFrame(b.values.tolist())
b.columns = ['values']
b = b.replace('CLS','', regex=True)
b = b.replace('SEP','', regex=True)
b = b.replace('\[]','', regex=True)
b = b.replace(',','', regex=True)
我知道使用 ','.join 应该可以,但它会输出:
b = df['tokens']
b = b.apply(lambda x: ','.join(x))
0 [,',[,C,L,S,],',,, ,',C,',,, ,',N,',,, ,',1,',...
1 [,',[,C,L,S,],',,, ,',C,',,, ,',O,',,, ,',c,',...
2 [,',[,C,L,S,],',,, ,',C,',,, ,',N,',,, ,',1,',...
3 [,',[,C,L,S,],',,, ,',C,',,, ,',N,',,, ,',1,',...
4 [,',[,C,L,S,],',,, ,',C,',,, ,',C,',,, ,',C,',...
...
5024 [,',[,C,L,S,],',,, ,',C,',,, ,',c,',,, ,',1,',...
5025 [,',[,C,L,S,],',,, ,',C,',,, ,',C,',,, ,',O,',...
5026 [,',[,C,L,S,],',,, ,',C,',,, ,',O,',,, ,',c,',...
5027 [,',[,C,L,S,],',,, ,',C,',,, ,',N,',,, ,',1,',...
5028 [,',[,C,L,S,],',,, ,',C,',,, ,',N,',,, ,',1,',...
Name: tokens, Length: 5029, dtype: object
【问题讨论】:
【参考方案1】:您很接近,您可以通过替换不需要的字符串元素来简化。无需使用连接。我创建了一个新列来应用更改,但这不是必需的。
#Create a new column, not needed but keeps track of changes
df['new_col']=df['tokens']
#replace strings
df['new_col'] = df['new_col'].replace('CLS','', regex=True)
df['new_col'] = df['new_col'].replace('SEP','', regex=True)
#Replace quotes, space, commas then brackets
df['new_col'] = df['new_col'].replace(('\'|\s|\,|\[|\]'),'', regex=True)
这会产生以下结果:
tokens new_col
0 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'c', '2',] CN1CCc2
1 ['[CLS]', 'C', 'O', 'c', '1', 'c', 'c', 'c',] COc1ccc
2 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'N', 'C', ] CN1CCNC
3 ['[CLS]', 'C', 'N', '1', 'C', 'C', 'c', '2',] CN1CCc2
4 ['[CLS]', 'C', 'C', 'C', 'c', '1', 'n', 'c',] CCCc1nc
更新:
#Create a new column, not needed but keeps track of changes
df['new_col']=df['tokens']
#replace strings
df['new_col'] = df['new_col'].replace('\[CLS]','', regex=True)
df['new_col'] = df['new_col'].replace('\[SEP]','', regex=True)
#Replace quotes, space, commas
df['new_col'] = df['new_col'].replace(('\'|\s|\,'),'', regex=True)
从符号替换行中删除括号并将它们添加到替换 CLS、SEP 字符串的行中。 (\用于转义正则表达式的特殊字符)
https://www.debuggex.com/cheatsheet/regex/python
【讨论】:
谢谢!!如果我需要保留一些括号,我该怎么办?我只希望 [CLS] 和 [SEP] 的括号消失,但其他任何括号都没有 更新了上面的答案,您只需从替换语句中删除括号并将它们添加到字符串的替换语句中。 那不是还在字符串的前面和后面留下括号吗? 如果您不希望通过阅读文档,可以使用正则表达式仅定位字符串开头和结尾的括号。 debuggex.com/cheatsheet/regex/python以上是关于用数组填充的 Pandas 列,连接数组内的值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用连接来填充列的缺失值 - Python Pandas?
如何将 numpy 数组存储在 Pandas 数据框的列中?