Python, Pandas: отфильтруйте фрейм данных в подмножество и обновите его на месте - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть кадр данных для панд, который выглядит следующим образом:

cleanText.head()
    source      word    count
0   twain_ess            988
1   twain_ess   works    139
2   twain_ess   short    139
3   twain_ess   complete 139
4   twain_ess   would    98
5   twain_ess   push     94

И словарь, содержащий общее количество слов для каждого источника:

titles
{'orw_ess': 1729, 'orw_novel': 15534, 'twain_ess': 7680, 'twain_novel': 60004}

Моя цель - нормализовать количество слов для каждого источника по общему количеству слов в этом источнике, то есть превратить их в процент. Похоже, это должно быть тривиально, но Python, кажется, делает это очень сложно (если бы кто-нибудь мог объяснить мне правила для операций на месте, это было бы здорово).

Предостережение возникает из-за необходимости фильтровать записи в cleanText только для записей из одного источника, а затем я пытаюсь на месте разделить счетчики для этого подмножества на значение в словаре.

# Adjust total word counts and normalize
for key, value in titles.items():

    # This corrects the total words for overcounting the '' entries
    overcounted= cleanText[cleanText.iloc[:,0]== key].iloc[0,2]
    titles[key]= titles[key]-overcounted

    # This is where I divide by total words, however it does not save inplace, or at all for that matter
    cleanText[cleanText.iloc[:,0]== key].iloc[:,2]= cleanText[cleanText.iloc[:,0]== key]['count']/titles[key]

Если бы кто-нибудь мог объяснить, как изменить этот оператор деления так, чтобы вывод фактически сохранялся в исходном столбце, это было бы здорово.

Спасибо

1 Ответ

0 голосов
/ 11 сентября 2018

Если я правильно понимаю:

cleanText['count']/cleanText['source'].map(titles)

Что дает вам:

0    0.128646
1    0.018099
2    0.018099
3    0.018099
4    0.012760
5    0.012240
dtype: float64

Чтобы переназначить эти процентные значения в столбец count, используйте:

cleanText['count'] = cleanText['count']/cleanText['source'].map(titles)
...