潘达斯保存和打开后数值变为字符串的问题

问题描述 投票:0回答:1

你好,我的问题如下。

  1. 计算一些向量。
  2. 把它们放在pandas数据框架的一列中(列名是 "test")
  3. 将数据帧保存为csv。(test.csv)
  4. read_csv 保存的csv文件。pd.read_csv("test.csv")
  5. 意识到向量不是numpy数组 而是像下面这样的字符串。
  '[[0.   0.   0.   0.123333.   0.\n    0.]\n
    [0.   0.   0.\n   0.123333.   0.    0.]\n
    [0.   0.222222.   0.   0.333333.   0.    0.]]'
  1. 我试着用这样的方法来解决这个问题。
  test = pd.read_csv("test.csv")    
  np.array(literal_eval(test["vector"][0]))

我得到这个错误

     File "<unknown>", line 1
        [[0.         0.         0.         0.         0.         0.
                      ^
    SyntaxError: invalid syntax

这里我链接了我使用的文件的下载。https:/drive.google.comfiled1MnJjPb-Gj_44dRXUHbNO64b-Z-wSrHScview?usp=共享。

创建矢量并放入df的代码。

    from sklearn.feature_extraction.text import TfidfVectorizer
    tfidf_vectorizer = TfidfVectorizer()
    tfidf_vectorizer.fit_transform(["example text","this is the list of words","like this"]).toarray()


    datadd = [["example text"],["this is the list of words"],["like this"]]
    vector = []
    for example in datadd:
        vector.append(tfidf_vectorizer.transform(example).toarray())
    pd.DataFrame({"vector":vector})
    pd.to_csv("test.csv")
python string numpy
1个回答
1
投票
  • vector 是一个 <class 'scipy.sparse.csr.csr_matrix'>

    • 将其转化为 list 前,将其加载到数据框架中
  • 申请 literal_eval 到整个列,当读取文件中。

import pandas as pd
import numpy as np
from ast import literal_eval

# before writing vector to a dataframe
vector  = np.array(vector).tolist()
df = pd.DataFrame({"vector": vector})
df.to_csv("test.csv", index=False)

# after reading the csv file in
test = pd.read_csv('test.csv', converters={'vector': literal_eval})
print(type(test.iloc[0, 0]))
>>> <class 'list'>

0
投票

csv文件是一个纯文本文件。只要用文本编辑器打开它,比如notepad++、vi,如果你使用的是Windows,甚至是记事本。也就是说,保存在csv文件中的,对于每个单元格来说只是它的文本表示。

潘达斯 read_csv 聪明到可以识别浮点和整数值,但不能识别列表、集合或numpy数组。对于日期值, parse_dates 参数可以提供帮助,但是AFAIK,对于numpy数组没有任何帮助。另外,在pandas列中存储numpy数组(或列表或其他复杂的对象)并不是一个很聪明的想法,因为pandas将永远无法对它使用其向量化方法。长话短说,IMHO,在pandas中存储复杂对象是误用工具。

遗憾的是,我不知道有什么简单的方法可以将字符串表示法(如从 str(arr))返回到numpy数组中。所以如果你想用这种方式,你必须在 Python 中为它写一个解析器,然后用 apply 它的大熊猫列。

© www.soinside.com 2019 - 2024. All rights reserved.