python - 顺序问题:循环遍历我的 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]
解决方案
一种解决方案是使用 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]
推荐阅读
- excel - VBA:获取运行时 1004:对象“_Worksheet”的方法“范围”失败。它没有复制到范围
- c - 递归阶乘函数程序为 C 中的大量输入返回 0
- kubernetes - Prometheus:减法上的标签匹配
- javascript - 能够注册和签署多个 Fido U2F 安全密钥
- reactjs - 流输入错误:无法使用绑定到操作的对象文字调用调度,因为:
- javascript - 生成 3 个非重复值
- javascript - noscript.innerHTML 跨浏览器有不同的结果
- firebase - Firebase Crashlytics:相同的应用程序发送到不同的 Firebase 项目
- linux - rpminstall - 在安装期间在 rpm 中运行 shell 脚本
- sql - 记录存在于一个 DB2 表中,但不存在于另一个表中