首页 > 解决方案 > 顺序问题:循环遍历我的 pandas DataFrame 是我唯一的解决方案吗?

问题描述

我有一个大的 DataFrame(~4M 行),其中一列包含字符串,这些字符串是句子。

sentence
"john went for a ride with his new car"
"miranda took her dog out for a walk"
"my dog hates car rides, he feels sick"

我想过滤掉只包含常用词的行。换句话说,如果一个句子包含上面所有行中以前未见过的单词(或出现次数少于 X 次的单词),我想保留该行,否则删除该行。

由于这是一个连续的事情,我必须在单词上构建一个字典,以及到目前为止每行看到它们的次数并以此为基础做出决定,我想我唯一的解决方案是循环遍历我的 DataFrame 。

我是否错过了避免循环的任何可能性?

编辑:下面比利的解决方案(被接受的解决方案)是一种很好的方法。但是,.toarray()由于我的矩阵很大,所以没有用。在这个线程的帮助下,我解决了它的稀疏格式。生成的代码在这里:

def sparseCumsum(matrix):
    a = scipy.sparse.csc_matrix(matrix)
    indptr = a.indptr
    data = a.data
    for i in range(a.shape[1]):
        st = indptr[i]
        en = indptr[i + 1]
        np.cumsum(data[st:en], out=data[st:en])


def reduceSentences(df):
    vectorizer = CountVectorizer(min_df=0, analyzer='word', ngram_range=(1, 1))
    countMatrix = vectorizer.fit_transform(df['sentence'])

    sparseCumsum(countMatrix)
    df['max_freq'] = countMatrix.max(axis=1).toarray()
    return df.loc[df['max_freq'] < 3]

标签: pythonpandasloops

解决方案


一种解决方案是使用 CountVectorizer 和获取带有词频的表并获取它们的累积和。然后,通过逐行获取它们的最大值,您可以看到一个单词被使用的最大次数。例如,如果数字是 1,那么所有单词都是新的。

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer

df1={'sentence':
["john went for a ride with his new car",
"miranda took her dog out for a walk",
"my dog hates car rides, he feels sick"]}

v = CountVectorizer(min_df=0,analyzer='word',ngram_range=(1,1))
x = v.fit_transform(df1['sentence'])
f = pd.DataFrame(x.toarray(), columns = v.get_feature_names())

df1['max_freq']=f.reset_index(drop=True).cumsum().max(axis=1)

print(df1)


                                sentence  max_freq
0  john went for a ride with his new car         1
1    miranda took her dog out for a walk         2
2  my dog hates car rides, he feels sick         2

现在您可以使用 max_freq 过滤您的句子。如果你想保留看到少于或等于 2 次的句子,那么:

df1[df1['max_freq']<=2]

推荐阅读