【问题标题】:Issue while inserting count vectorizer results to the dataframe将计数矢量化器结果插入数据帧时出现问题
【发布时间】:2022-01-17 13:11:51
【问题描述】:

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

我用过的代码。

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}

【问题讨论】:

    标签: python-3.x pandas countvectorizer


    【解决方案1】:

    你确定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)
    

    【讨论】:

    • 是的,它是 (4237,6)。如果是 (1287,6),那么 1287 也将添加到测试数据中,这将使其成为 (3103,25),对吧?
    • 原始数据框的形状是什么(在 train_test_split 之前)?
    • 是 (6053, 29)。我删除了一些无用的列。
    • 并尝试用toarray替换todense
    • 好的。我想我明白了。试试:train_social_media_df = pd.DataFrame(train_social_media_vector.todense(), columns=social_media_vectorizer.get_feature_names_out(), index=xtrain.index)。现在您可以在不使用 ignore_index 的情况下进行连接。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2020-12-25
      • 1970-01-01
      • 2017-11-07
      • 2017-08-23
      • 2020-06-25
      • 2011-01-21
      相关资源
      最近更新 更多