熊猫不会丢弃符合条件的行和列

时间:2018-07-13 14:28:34

标签: python pandas

我正在尝试建立一个回归模型,以便根据出现的单词来预测收视率(1-5)(回归本身不一定表现良好,更多的是关于所采用的方法)。 我使用以下代码创建了一个词频矩阵:

bow = df.Review2.str.split().apply(pd.Series.value_counts)

看起来像这样:

enter image description here

我现在有兴趣删除在评论中很少出现的列(单词)。此外,我只想遍历具有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

中的整数

2 个答案:

答案 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)

它应该完成工作。