首页 > 编程问答 >将 Pandas 对象数据帧转换为向量数据帧?

将 Pandas 对象数据帧转换为向量数据帧?

时间:2024-08-08 05:28:35浏览次数:8  
标签:python pandas dataframe vector scikit-learn

我有一个 Pandas 数据框(超过 1k 行)。我的数据框中有数字、对象、字符串和布尔值。我想将数据帧的每个“单元格”转换为向量,并使用结果向量。然后,我计划比较每一行向量的相似性。

例如,我的数据是:

Col 0,Col 1,Col 2,Col 3,Col 4,Col 5,Col 6,Col 7,Col 8,Col 9,Col 10

12,65e1e35b7fe333,harry Joe,1,FALSE,swe,1,142.158.0.2,10.10.0.2,text1,0
13,65e1e35b7fe599,allen,1,FALSE,swe,1,142.158.0.20,10.10.0.20,text2,0
14,65e1e35b7fe165,carter,1,FALSE,swe,1,142.158.0.21,10.10.0.21,text3,0

我想最终得到一个如下所示的向量数据框:

Col 0,Col 1,Col 2,Col 3,Col 4,Col 5,Col 6,Col 7,Col 8,Col 9,Col 10

Vect1,Vect2,Vect3,Vect4,Vect5,Vect6,Vect7,Vect8,Vect9,Vect10,Vect11

Vect12,Vect 13,Vect 14,Vect4,Vect5,Vect6,Vect7,Vect 15,Vect 16,Vect 17,Vect11

Vect18,Vect 19,Vect 20,Vect4,Vect5,Vect6,Vect7,Vect 21,Vect 22,Vect 23,Vect11

有没有一个好的方法可以做到这一点也许在 Python w SciKit 中?

我尝试过:

import pandas as pd 
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer

df=mydata

vectorizer = TfidfVectorizer()

# Transform the data to feature vectors
X = vectorizer.fit_transform(df)
X = pd.DataFrame(_X.todense(), index=df.index, columns=vectorizer.vocabulary_)
X.head()

# Labels
y = df['label']


What I got was:

TypeError                                 Traceback (most recent call last)
Cell In[11], line 14
     11 vectorizer = TfidfVectorizer()
     13 # Transform the text data to feature vectors
---> 14 X = vectorizer.fit_transform(df)
     16 X = pd.DataFrame(_X.todense(), index=df.index, columns=vectorizer.vocabulary_)
     17 X.head()

File /anaconda/envs/xxx_py38/lib/python3.9/site-packages/sklearn/feature_extraction/text.py:2079, in TfidfVectorizer.fit_transform(self, raw_documents, y)
   2072 self._check_params()
   2073 self._tfidf = TfidfTransformer(
   2074     norm=self.norm,
   2075     use_idf=self.use_idf,
   2076     smooth_idf=self.smooth_idf,
   2077     sublinear_tf=self.sublinear_tf,
   2078 )
-> 2079 X = super().fit_transform(raw_documents)
   2080 self._tfidf.fit(X)
   2081 # X is already a transformed view of raw_documents so
   2082 # we set copy to False

File /anaconda/envs/xxx_py38/lib/python3.9/site-packages/sklearn/feature_extraction/text.py:1338, in CountVectorizer.fit_transform(self, raw_documents, y)
   1330             warnings.warn(
   1331                 "Upper case characters found in"
   1332                 " vocabulary while 'lowercase'"
   1333                 " is True. These entries will not"
   1334                 " be matched with any documents"
   1335             )
   1336             break
-> 1338 vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary_)
   1340 if self.binary:
   1341     X.data.fill(1)

File /anaconda/envs/xxx_py38/lib/python3.9/site-packages/sklearn/feature_extraction/text.py:1207, in CountVectorizer._count_vocab(self, raw_documents, fixed_vocab)
   1205 values = _make_int_array()
   1206 indptr.append(0)
-> 1207 for doc in raw_documents:
   1208     feature_counter = {}
   1209     for feature in analyze(doc):

TypeError: 'Data' object is not iterable

你收到的错误是因为 TfidfVectorizer 是为了处理文本语料库而设计的。它期望输入是一个字符串列表或可迭代对象,其中每个字符串代表一个文档。你正在将整个数据框传递给它,这就是导致错误的原因。

以下是一种将数据框的每一行表示为向量并计算相似度的方法:

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

data = {
    'Col 0': [12, 13, 14],
    'Col 1': ['65e1e35b7fe333', '65e1e35b7fe599', '65e1e35b7fe165'],
    'Col 2': ['harry Joe', 'allen', 'carter'],
    'Col 3': [1, 1, 1],
    'Col 4': [False, False, False],
    'Col 5': ['swe', 'swe', 'swe'],
    'Col 6': [1, 1, 1],
    'Col 7': ['142.158.0.2', '142.158.0.20', '142.158.0.21'],
    'Col 8': ['10.10.0.2', '10.10.0.20', '10.10.0.21'],
    'Col 9': ['text1', 'text2', 'text3'],
    'Col 10': [0, 0, 0]
}
df = pd.DataFrame(data)

# 将所有列转换为字符串类型
df = df.astype(str)

# 将每一行连接成一个字符串
documents = df.apply(lambda x: ' '.join(x), axis=1)

# 使用 TF-IDF 将文档转换为向量
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(documents)

# 计算向量之间的余弦相似度
similarity_matrix = cosine_similarity(vectors)

# 将相似度矩阵打印为数据框(可选)
similarity_df = pd.DataFrame(similarity_matrix, index=df.index, columns=df.index)
print(similarity_df)

说明:

  1. 数据预处理:
  2. 首先,我们将数据框中的所有列转换为字符串类型。这是必要的,因为 TfidfVectorizer 是为了处理文本数据而设计的。
  3. 接下来,我们使用 apply 方法和一个 lambda 函数将每一行连接成一个字符串。这将创建我们文档语料库,其中每个文档代表数据框中的一行。

  4. 特征向量化:

  5. 我们创建一个 TfidfVectorizer 对象,它将使用词频-逆文档频率 (TF-IDF) 技术将我们的文档转换为数值向量。TF-IDF 是一种统计度量,它反映了一个词语对语料库中一份文档的重要性。
  6. fit_transform 方法对文档进行拟合,计算每个词语的 TF-IDF 分数,并将文档转换为向量。

  7. 相似度计算:

  8. 我们使用 cosine_similarity 函数计算向量之间的成对余弦相似度。余弦相似度是一种度量两个向量之间相似度的度量。它计算两个向量夹角的余弦值。

  9. 结果(可选):

  10. 我们创建一个新的数据框 similarity_df 来以表格形式显示相似度矩阵。相似度矩阵中的每个单元格 (i, j) 表示文档 i 和文档 j 之间的相似度分数。

这个过程将为你提供一个相似度矩阵,其中包含数据框中每一行对之间的相似度分数。

标签:python,pandas,dataframe,vector,scikit-learn
From: 78845582

相关文章

  • 为什么 Python NewType 与 isinstance 和 type 不兼容?
    这似乎不起作用:fromtypingimportNewTypeMyStr=NewType("MyStr",str)x=MyStr("HelloWorld")isinstance(x,MyStr)我什至没有得到False,但是TypeError:isinstance()arg2mustbeatypeortupleoftypes因为MyStr是一个函数......
  • Python & Selenium 4 & Edge 浏览器 |加载个人浏览器配置文件(包括cookie)
    使用Selenium4,我尝试加载我的个人浏览器配置文件(包括cookie),以便它可以加载到我之前登录过的网站。我正在使用边缘浏览器。在测试我的代码片段时,它似乎没有加载我的浏览器配置文件,而是创建一个新的(配置文件1)。我已确保配置文件的路径是正确的。我的代码片段:edge_opt......
  • 如何在通用 Python 类中输入 __eq__ ?
    当我定义带有泛型类型参数的类型时(例如K/V映射的键和值),我似乎无法编写合适的isinstance检查来实现__eq__:fromcollectionsimportOrderedDictfromcollections.abcimportMutableMappingfromtypingimportTypeVarK=TypeVar("K")......
  • 无法使用 devstack 安装 openstack 因为 python 版本
    我正在使用默认的python3.8.10运行./stack.sh,我收到此错误,因为我需要3.9或更高版本3.8msg错误但是当我将默认版本更改为3.9时,我收到错误没有找到模块“apt_pkg”3.9msgerror我一直在em之间来回跳动,但错误仍然存​​在(我也每次都会检查版本)......
  • Python @overload 使用联合类型会导致函数签名重叠错误
    我想编写以下重载的Python函数:fromtypingimportAny,TypeVar,overload_T1=TypeVar('_T1')_T2=TypeVar('_T2')_T3=TypeVar('_T3')@overloaddefparse_as(ty:type[_T1]|type[_T2],s:bytes)->_T1|_T2:...@overload......
  • 如何使用 FastAPI 返回 JSON 格式的 csv 文件/Pandas DataFrame?
    我有一个.csv文件,我想在FastAPI应用程序中渲染。我只设法以JSON格式呈现.csv文件,如下所示:deftransform_question_format(csv_file_name):json_file_name=f"{csv_file_name[:-4]}.json"#transformsthecsvfileintojsonfilepd.r......
  • python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行
    总体而言:我尝试使用Cloudbuild和Cloudrun构建BERT模型。我将模型(参数)和元数据(标签)保存在GCPCloudStorage中。但是,我遇到了通过joblib.load()加载metadata.bin文件的错误。我的metadata.bin文件包含UTF-8字符,但joblib.load需要ASCII字符。在......
  • Python + Svelte,如何使用本地文件系统
    总结一下,我有一个用python编写的应用程序。它在输入时需要一堆视频文件。使用一些魔法并生成合并的视频文件输出。我没有找到一个好的GUI解决方案(tkinter,QT,TUI等),所以我选择Svelte框架。但是出现了一个问题,我如何使用本地文件系统。在GUI(svelte)上,我必须上......
  • 如何在Python中绘制伪球面
    目标是使用meshgrid和numpy库生成伪球体的三维图形,但我使用下面的代码生成的图形不完整u=np.linspace(0,np.pi,50)v=np.linspace(0,2*np.pi,100)x,y=np.meshgrid(u,v)X=np.arccos(x)*np.cos(y)Y=np.arccos(x)*np.sin(y)Z=x-np.tan(x)fig=plt.f......
  • 18:Python集合属性
    #Python3集合#集合(set)是一个无序的不重复元素序列。#集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。#集合中元素必须是不可变类型,也就说里面不能是列表和字典#可以使用大括号{}创建集合,元素之间用逗号,分隔,或者也可以使用set()函数创建集合。s......