【问题标题】:String type to array or list pandas column字符串类型到数组或列表 pandas 列
【发布时间】:2023-01-17 00:20:55
【问题描述】:

我有如下的熊猫数据框:

        id                                   emb    
0   529581720   [-0.06815625727176666, 0.054927315562963486, 0...   
1   663817504   [-0.05805483087897301, 0.031277190893888474, 0...   
2   507084910   [-0.07410381734371185, -0.03922194242477417, 0...   
3   1774950548  [-0.09088297933340073, -0.04383128136396408, -...   
4   725573369   [-0.06329705566167831, 0.01242107804864645, 0....

emb 列的数据类型是object。现在我想将它们转换成 numpy 数组。所以我尝试了以下:

embd = df[embd].values

但由于它是字符串格式,我得到以下输出:

embd[0]

out:
array('[-0.06815625727176666, 0.054927315562963486, 0.056555990129709244, -0.04559280723333359, -0.025042753666639328, -0.06674829870462418, -0.027613995596766472, 
0.05307046324014664, 0.020159300416707993, 0.012015435844659805, 0.07048438489437103, 
-0.020022081211209297, -0.03899797052145004, -0.03358669579029083, -0.06369364261627197, 
-0.045727960765361786, -0.05619484931230545, -0.07043793052434921, -0.07021039724349976, 
2.8020248282700777E-4, -0.04271571710705757, -0.04004468396306038, 0.01802503503859043, -0.0553901381790638, 0.0068290019407868385, -0.021117383614182472, -0.06583991646766663]',
      dtype='<U11190')

有人能告诉我如何将其成功转换为具有 float32 值的数组。

【问题讨论】:

  • 这回答了你的问题了吗? How to convert string representation of list to a list
  • 你是怎么得到这个数据框的?从加载 csv? Pandas 显示使字符串、列表和数组看起来几乎相同(省略字符串中的引号等)。该 csv 的第一行是什么样的?包含列表或数组的数据框不能很好地保存到 csv。

标签: python arrays pandas numpy


【解决方案1】:

您可以使用 numpy 函数 numpy.array() 将字符串数组转换为具有 float32 值的数组。这是一个例子:

import numpy as np

string_array = ["1.0", "2.5", "3.14"]

float_array = np.array(string_array, dtype=np.float32)

或者,您可以使用 pandas 函数 pandas.to_numeric() 将数据框列的值从字符串转换为 float32。这是一个例子:

import pandas as pd

df = pd.DataFrame({"A": ["1.0", "2.5", "3.14"]})
df["A"] = pd.to_numeric(df["A"], downcast='float')

您还可以使用 pd.to_numeric() 方法并使用 errors='coerce' 参数捕获尝试将字符串转换为浮点数时可能出现的错误。这会将无效的字符串值替换为 NaN。

df['A'] = pd.to_numeric(df['A'], errors='coerce')

【讨论】:

  • 但这看起来像是数组的打印显示,而不是字符串列表。
【解决方案2】:

使用ast.literal_eval

import ast

df['emb'] = df['emb'].apply(ast.literal_eval)

输出:

>>> np.stack(df['emb'].values)

array([[-0.06815626,  0.05492732],
       [-0.05805483,  0.03127719],
       [-0.07410382, -0.03922194],
       [-0.09088298, -0.04383128],
       [-0.06329706,  0.01242108]])

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2019-05-31
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多