Python Pandas-应用Lambda保留初始格式

时间:2018-06-27 12:26:14

标签: python pandas

我想改造这个系列

from nltk import word_tokenize, pos_tag
from nltk.corpus import stopwords
stop_words = set(stopwords.words("english"))
df = pd.Series([["comic of book", "horror of movie"], ["dark", "dark french"]])
>> 0  [comic of book, horror of movie]
>> 1  [dark, dark french]

通过删除stopwords并仅保留名词(NN中的nltk)。我认为apply函数是最好的解决方案,但是直接将其应用于这些文本会导致信息丢失。我明白了

df.apply(lambda x: [wrd for ing in x for wrd in word_tokenize(ing) if wrd not in stop_words])
0    [comic, book, horror, movie]
1            [dark, dark, french]

代替

0    [comic book, horror movie]
1            [dark, dark french]

我错过了for loop中的某些内容,并且将每个bag of words分隔为唯一的words(也许apply在这里不好)

2 个答案:

答案 0 :(得分:1)

def rmsw(y):
    return ' '.join(set(y.split()) - stop_words)

pd.Series([[rmsw(y) for y in x] for x in df], df.index)

0    [comic book, horror movie]
1           [dark, dark french]
dtype: object

保持秩序和频率

def rmsw(y):
    return ' '.join([w for w in y.split() if w not in stop_words])

pd.Series([[rmsw(y) for y in x] for x in df], df.index)

答案 1 :(得分:1)

如果性能比优雅更重要,则经典算法可以解决问题。

以下代码永远不会赢得选美比赛,但是(在我的ThinkPad上)性能比公认的列表理解方法高出约350-400%。差距将随着数据集的大小而增加,因为它正在处理更原始的数据类型(列表),并最终转换回熊猫。

temp_list = list()

for serie in df:
    elements = list()
    for element in serie:
        for word in element.split():
            if word in stop_words:
                element = element.replace(f' {word} ', ' ')

        elements.append(element)

    temp_list.append(elements)

df = pd.Series(temp_list)
print(df)

选择取决于您:)