首页 > 解决方案 > 熊猫将数组列转换为具有条件的多列

问题描述

我有一个带有 2 列的熊猫数据框:

像这样:

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 = 1st embedding value, feature2 = 2nd embedding value .... 对于下一种语言,开始特征值 = n+size_of_embedding:。因此,对于每种语言,添加的列数正好等于 size_of_embedding 数组。对于遇到的每种下一种语言,我们从n+size_of_embedding:开始。有没有一种简单的方法可以做到这一点?谢谢。

标签: pandas

解决方案


首先确保该embedding列实际上是一个数组。如果它存储为字符串,您可以将其转换为 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

推荐阅读