python - 根据 Pandas 数据框中的另一列和外部列表设置一列
问题描述
我正在尝试在 Pandas 数据框中创建一个新列,该列仅从 5 个数组列表中获取一个数组(列表标题为cluster_centre
)并将该数组放入数据框中。它将采用与同一数据帧的“标签”列中的值匹配的索引处的数组(其值为 0、1、2、3 或 4)。因此,例如,如果该行中的句子的标签为 2,即该行的“标签”列值为 2,则该行 df 中的“cluster_centres”列的值为cluster_centre[2]
。我怎样才能做到这一点?我尝试的代码粘贴在下面:
from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
import pandas as pd
with open('JWN_Nordstrom_MDNA_overview_2017.txt', 'r') as file:
initial_corpus = file.read()
corpus = initial_corpus.split('. ')
# Extract sentence embeddings
embedder = SentenceTransformer('bert-base-wikipedia-sections-mean-tokens')
corpus_embeddings = embedder.encode(corpus)
# Perform KMeans clustering
num_clusters = 5
clustering_model = KMeans(n_clusters=num_clusters)
clustering_model.fit(corpus_embeddings)
cluster_assignment = clustering_model.labels_
cluster_centre = clustering_model.cluster_centers_
# Create dataframe
All_data_df = pd.DataFrame()
All_data_df['sentences'] = corpus
All_data_df['embeddings'] = corpus_embeddings
All_data_df['labels'] = cluster_assignment
# The line below creates a ValueError
All_data_df['cluster_centres'] = cluster_centre[All_data_df['labels']]
print(All_data_df.head())
我收到此错误:ValueError: Wrong number of items passed 768, placement implies 1
更新:我做了一些新的东西并尝试了这个:
All_data_df = pd.DataFrame()
All_data_df['sentences'] = corpus
All_data_df['embeddings'] = corpus_embeddings
All_data_df['labels'] = cluster_assignment
#All_data_df['cluster_centres'] = 0
for index, row in All_data_df.iterrows():
iforval = cluster_centre[row['labels']]
All_data_df.at[index, 'cluster_centres'] = iforval
print(All_data_df.head())
但是得到一个新的错误:ValueError: Must have equal len keys and value when setting with an iterable
. 我在循环内打印iforval
,它确实从cluster_centre
列表中返回了 29 个正确的数组,与数据框中存在的 29 行匹配。现在我只需要将它们放入数据框的新列中,但是 .at[] 不起作用,不确定我是否正确使用它。
编辑/更新:好的,我找到了一种解决方案,不知道为什么我之前没有意识到这一点,我只是事先创建了一个列表并将其放入新列,最终变得简单得多。
cluster_centres_list = [cluster_centres[label] for label in cluster_assignment]
all_data_df = pd.DataFrame()
all_data_df['sentences'] = corpus
all_data_df['embeddings'] = corpus_embeddings
all_data_df['labels'] = cluster_assignment
all_data_df['cluster_centres'] = cluster_centres_list
print(all_data_df.head())
解决方案
推荐阅读
- xml - XML:Twig 在文件上执行多个 twig 处理程序
- javascript - 登录reactjs后无法重定向
- json - 使用 JOLT 传输 Json 输出时出现问题
- c++ - C++ HDF5 编译错误:-lhdf5 未找到
- python - 如何在 Python 中对表格进行排序
- python - 有条件地进入一个for循环
- node.js - 弃用警告:grpc.load
- c# - 基于给定列的两个数据表之间的差异
- reactjs - 在反应中,我如何在 ExpansionPanel 中动态设置 defaultExpanded
- hadoop - 已安装 Apache Zepplin 0.8 但 localhost:8080 中的连接错误