python - one-hot-encode验证数据
问题描述
我有一个单热编码的特征矩阵,其中特征是训练数据的子字符串。
我只有这个最终的数据框,其中包含rows = samples, columns = substrings (one-hot-encoded)
. 现在我想对一组新数据进行一次热编码。数据包括,rows = samples, columns = String
我需要检查每个样本的字符串是否包含任何子字符串(特征)并对它们进行单热编码。
循环遍历所有字符串和子字符串不够快,因为我有大量数据。什么是解决这个问题的快速方法?
编辑:示例:我在列表中有一些字符串,并且有一个热编码矩阵,其中包含以下子字符串:
strings = ['foobarista', 'foobar']
substrings = {'foo' : [1,1] ,
'bar' : [1,1],
'ist' : [0,1],
'sta' : [0,1]}
df_one_hot = pd.DataFrame(substrings)
假设这是我的训练数据,所以我有 features foo, bar, ist, sta
。
现在我有了新数据:
new_strings = ['barista', 'barfoo', 'house']
并且想要检查这些新字符串,如果它们包含上面数据框中的任何子字符串。
new_substrings = {'foo' : [0,1,0] ,
'bar' : [1,1,0],
'ist' : [1,0,0],
'sta' : [1,0,0]}
new_df = pd.DataFrame(new_substrings)
解决方案
new_substrings
可以通过双重列表理解来完成。内部理解遍历所有条目new_string
,外部为所有条目创建字典sub_strings
:
import re
new_strings = ['barista', 'barfoo', 'house']
sub_strings = ['foo', 'bar', 'ist', 'sta']
new_substrings= {sub_s: [ (re.search(sub_s, s) is not None)*1 for s in new_strings] for sub_s in sub_strings}
print(new_substrings)
这将返回:
{'foo': [0, 1, 0], 'bar': [1, 1, 0], 'ist': [1, 0, 0], 'sta': [1, 0, 0]}
然后,您可以使用df = pd.DataFrame(new_substrings)
.