我有一个包含 2 列的 Pandas 数据框:
像这样:
embedding language
[0.1 0.2 0.3] fr
[0.1 0.4 0.4] en
[0.8 0.1 0.1] fr
给定一个起始整数 n = 10,对于嵌入列的每个值,我想向上述数据框中添加一列,如下所示:
embedding language feature1 feature2 feature3
[0.1 0.2 0.3] fr 10:0.1 11:0.2 12:0.3
[0.1 0.4 0.4] en 13:0.1 14:0.4 15:0.4
[0.8 0.1 0.1] fr 10:0.8 11:0.1 12:0.1
所以,feature1 = 第一个嵌入值,feature2 = 第二个嵌入值......对于下一种语言,开始的特征值 = n+size_of_embedding:。
因此,对于每种语言,添加的列数恰好等于 size_of_embedding 数组。对于遇到的每种下一种语言,我们从 n+size_of_embedding: 开始。有没有简单的方法来做到这一点?谢谢。
最佳答案
首先确保embedding
column 实际上是一个数组。如果它存储为字符串,则可以将其转换为 numpy 数组,如下所示:
df.embedding = df.embedding.apply(lambda x: np.fromstring(x[1:-1], sep=' '))
创建语言及其起始值的查找列表,并使用它来生成
特征
lookup = {'fr': 10, 'en': 13}
如果您有太多语言无法手动创建,您可以尝试以下语句,替换
10
& 3
适合您的实际数据集lookup = {l:10+i*3 for i, l in enumerate(df.language.drop_duplicates().to_list())}
生成特征只是一个查找和列表理解。这里我使用了辅助函数
f
保持代码整洁。def f(lang, embeddings):
return [f'{lookup[lang]+i}:{e}' for i, e in enumerate(embedding)]
new_names = ['feature1', 'feature2', 'feature3']
df[new_names] = df.apply(lambda x: f(x.language, x.embedding), axis=1, result_type='expand')
df 现在看起来像:
embedding language feature1 feature2 feature3
0 [0.1, 0.2, 0.3] fr 10:0.1 11:0.2 12:0.3
1 [0.1, 0.4, 0.4] en 13:0.1 14:0.4 15:0.4
2 [0.8, 0.1, 0.1] fr 10:0.8 11:0.1 12:0.1
关于 Pandas 将数组列转换为具有条件的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61690610/