pandas - 熊猫将数组列转换为具有条件的多列
问题描述
我有一个带有 2 列的熊猫数据框:
- 嵌入为数组列和嵌入的大小 = size_of_embedding
- 语
像这样:
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:开始。有没有一种简单的方法可以做到这一点?谢谢。
解决方案
首先确保该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
推荐阅读
- regex - 如何在 IntelliJ IDEA 中指定正则表达式方言?
- docker - 当我不想编辑的 Tomcat Docker 映像不作为 ROOT 运行时,如何写入 ROOT 拥有的目录?
- sql - 如何将要分隔的列表、数组或字符串作为参数传递给 redshift
- amazon-web-services - aws ec2 ssh 错误:`ssh:连接到主机 x 端口 22:操作超时`
- python - 在 DO 服务器上的 django 生产中进行 api 请求调用时,我得到了 429 状态,但是从本地主机运行时没有发生此类错误
- azure-hdinsight - HDInsight:Hive Metastore - 架构版本 2.1.2?
- php - TypeError:无法在字符串“lastUpdateCheck 1599160669280”上创建属性“lastUpdateCheck”
- javascript - Vue.js 定义 lodash 需要 "this._"
- javascript - MaterialUI 自动完成 - 选择选项时避免清除输入文本过滤器
- python - 从基于列的数组中返回多数加权投票