用数组填充的 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?

与 pandas 的近似连接

NumPy 填充大型数组的给定边界框坐标内的值

如何将 numpy 数组存储在 Pandas 数据框的列中?

如何将 numpy 数组存储在 Pandas 数据框的列中?

Pandas:合并数据框并将多个连接值合并到一个数组中