我正在尝试建立一个回归模型,以便根据出现的单词来预测收视率(1-5)(回归本身不一定表现良好,更多的是关于所采用的方法)。 我使用以下代码创建了一个词频矩阵:
bow = df.Review2.str.split().apply(pd.Series.value_counts)
看起来像这样:
我现在有兴趣删除在评论中很少出现的列(单词)。此外,我只想遍历具有Rating
值而不是NaN
的评论(行)。
这是我的尝试:
# Delete row if Rating less than 1
for index, row in df.iterrows():
if (df.Rating[index] < 1):
bow.drop(bow.index[index], axis=0, inplace = True)
# Delete column if word occurs less than 50 times
sum1 = bow.sum(axis=0)
cntr = 0
for i in sum1:
if (i < 50):
bow.drop(bow.index[cntr], axis=1, inplace = True)
cntr += 1
这似乎没有用,因为它使单词只出现一次。
编辑:
这是我的稀疏数据框,其中包含单词的出现。 Col->单词; 行->句子(项目的评论)(我有1.5k项,因此有1.5k行)
hi this are just some random words I don t ... zing zingy zingzang
0 1.0 NaN 1.0 1.0 1.0 NaN NaN NaN NaN NaN ... NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 ... NaN NaN NaN
Rating
是我的原始数据框中的一列,其中包含[1,5]
范围或NaN
答案 0 :(得分:2)
您可以使用向量化运算,而不是手动迭代:
# filter out rows where Rating < 1
bow = bow[~(bow['Rating'] < 1)]
# filter out columns where sum < 50
bow = bow.loc[:, ~(bow.sum(0) < 50)]
或同时:
# filter rows and columns with Boolean series
bow = bow.loc[~(bow['Rating'] < 1), ~(bow.sum(0) < 50)]
答案 1 :(得分:2)
我举了这个工作玩具的例子:
import pandas as pd
import numpy as np
# Create a toy daframe
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A', 'B', 'C', 'D'])
print(df)
# A B C D
#-------------
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
# Sum all the values for each column
column_sum = df.sum(axis=0)
print(column_sum)
# A 12
# B 15
# C 18
# D 21
# Iterate over Columns name and sum value
for key,value in zip(df.keys(),sum1):
if(value < 16):
df.drop(columns=key, axis=1, inplace = True)
print(df)
# C D
# 0 2 3
# 1 6 7
# 2 10 11
所以我想如果您将代码更改为:
for key,value in zip(df.keys(),sum1):
if(value < 50):
bow.drop(columns=key, axis=1, inplace = True)
它应该完成工作。