Использование панд сбрасывает дубликаты, но неправильно удаляет дубликаты - PullRequest
0 голосов
/ 13 января 2019

Прежде всего, я не уверен, является ли это drop_duplicates() ошибкой или нет.


Что я хочу сделать:
Импортировать файл из csv, сделать re.search для каждой строки, если совпадает, сохранить строку в словаре, если не совпадает, сохранить строку в другом словаре. Составьте график из длины словарного значения.


Проблема
У меня есть 1000 строк внутри CSV, но результат возвращает 1200.


Мой код

import pandas as pd
import re

# import data
filename = 'sample.csv'

# save data as data
data = pd.read_csv(filename, encoding='utf-8')

# create new dictionary for word that is true and false 
# but doesn't have the keyword in items
wordNT = {}
wordNF = {}
kaiT = {}
kaiF = {}

# if text is True
def word_in_text(word,text,label):
    match = re.search(word,text)

    if match and label == True:
        kaiT.setdefault('text', []).append(text)
    elif match and label == False:
        kaiF.setdefault('text', []).append(text)
    elif label == True and not match:
        wordNT.setdefault('text', []).append(text)
    elif label == False and not match:
        wordNF.setdefault('text', []).append(text)

# iterate every text in data
for index, row in data.iterrows():
    word_in_text('foo', row['text'], row['label'])
    word_in_text('bar', row['text'], row['label'])

# make pandas data frame out of dict
wordTDf = pd.DataFrame.from_dict(wordNT)
wordFDf = pd.DataFrame.from_dict(wordNF)
kaiTDf = pd.DataFrame.from_dict(kaiT)
kaiFDf = pd.DataFrame.from_dict(kaiF)

# drop duplicates
wordTDf = wordTDf.drop_duplicates()
wordFDf = wordFDf.drop_duplicates()
kaiTDf = kaiTDf.drop_duplicates()
kaiFDf = kaiFDf.drop_duplicates()

# count how many 
wordTrueCount = len(wordTDf.index)
wordFalseCount = len(wordFDf.index)
kaiTrueCount = len(kaiTDf.index)
kaiFalseCount = len(kaiFDf.index)

print(wordTrueCount + wordFalseCount + kaiTrueCount + kaiFalseCount)


Когда я убрал строку

word_in_text('bar', row['text'], row['label'])

и только держи

word_in_text('foo', row['text'], row['label'])


print(wordTrueCount + wordFalseCount + kaiTrueCount + kaiFalseCount) возвращает 1000 правильно, и наоборот. Но когда нет, возвращается 1200, а должно быть только 1000?


CSV INPUT sample
текст, этикетка
"эй", ИСТИНА
"гало", ЛОЖЬ
«Как дела?», ИСТИНА


ОЖИДАЕМЫЙ ВЫХОД
1000


ВЫХОД * * тысяча пятьдесят-один * * 1200 тысяча пятьдесят-дв

1 Ответ

0 голосов
/ 14 января 2019

В функции word_in_text вы обновляете четыре слова: wordNT, wordNF, kaiT и kaiF.

И вы дважды вызываете word_in_text во время итерации кадра данных:

# iterate every text in data
for index, row in data.iterrows():
    word_in_text('foo', row['text'], row['label'])
    word_in_text('bar', row['text'], row['label'])

Таким образом, результат поиска представляет собой смесь результата из 'foo' и результата из 'bar'.

Вместо этого вы должны очистить четыре слова перед началом нового поиска:

def search(text):
    wordNT = {}
    wordNF = {}
    kaiT = {}
    kaiF = {}

    # iterate every text in data
    for index, row in data.iterrows():
        word_in_text(text, row['text'], row['label'])

    # make pandas data frame out of dict
    wordTDf = pd.DataFrame.from_dict(wordNT)
    wordFDf = pd.DataFrame.from_dict(wordNF)
    kaiTDf = pd.DataFrame.from_dict(kaiT)
    kaiFDf = pd.DataFrame.from_dict(kaiF)

    # drop duplicates
    wordTDf = wordTDf.drop_duplicates()
    wordFDf = wordFDf.drop_duplicates()
    kaiTDf = kaiTDf.drop_duplicates()
    kaiFDf = kaiFDf.drop_duplicates()

    # count how many 
    wordTrueCount = len(wordTDf.index)
    wordFalseCount = len(wordFDf.index)
    kaiTrueCount = len(kaiTDf.index)
    kaiFalseCount = len(kaiFDf.index)

    print(wordTrueCount + wordFalseCount + kaiTrueCount + kaiFalseCount)

search('foo')
search('bar')
...