将计数矢量化器结果插入数据帧时出现问题

Issue while inserting count vectorizer results to the dataframe

我有一个形状为 (4237, 19) 的数据框,然后是其他形状为 (4237, 6) 的数据框,我需要按列组合这两个数据框,因此技术上生成的数据框应该是形状 (4237, 25) 但我得到的是 (5524, 25)。我无法理解这个问题。

我用过的代码

social_media_vectorizer = CountVectorizer(lowercase=True)

train_social_media_vector = social_media_vectorizer.fit_transform(x_train["social_media"].values.astype("U"))
test_social_media_vector = social_media_vectorizer.transform(x_test["social_media"].values.astype('U'))

print(x_train.shape)
print(x_test.shape)

train_social_media_df = pd.DataFrame(train_social_media_vector.todense(), columns=social_media_vectorizer.get_feature_names_out())
test_social_media_df = pd.DataFrame(test_social_media_vector.todense(), columns=social_media_vectorizer.get_feature_names_out())
x_train = pd.concat([x_train, train_social_media_df], axis=1)
x_test = pd.concat([x_test, test_social_media_df], axis=1)

print("="*100)
print(x_train.shape)
print(x_test.shape)

print("="*100)
print(social_media_vectorizer.vocabulary_)

结果

(4237, 19)
(1816, 19)
====================================================================================================
(5524, 25)
(3058, 25)
====================================================================================================
{'facebook': 0, 'linkedin': 2, 'twitter': 4, 'instagram': 1, 'youtube': 5, 'producthunt': 3}

你确定 train_social_media_vector.todense() 的形状是 (4237, 6) 吗?好像是 (1287, 6)

尝试ignore_index=True:

x_train = pd.concat([x_train, train_social_media_df], axis=1, ignore_index=True)
x_test = pd.concat([x_test, test_social_media_df], axis=1, ignore_index=True)

在执行 concat 之前检查 x_trainx_test 的索引。我假设它们的索引与其他索引不同。进行串联时,所有行都由相同的索引连接。默认情况下,缺失的行将用 NaN 填充。如果您根本不关心索引,只需在执行连接之前使用 .reset_index(drop=True) 删除它们,或者在调用 pd.concat() 时使用 ignore_index=True 忽略它们。请参阅上面@Corralien 的回答。