首页 > 解决方案 > 根据 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())

标签: pythonpandasdataframe

解决方案


推荐阅读