Как посчитать разделенные запятыми повторные значения в столбце панд? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть такой столбец данных:

1    Applied Learning, Literacy & Language
2             Literacy & Language, Special Needs
3            Math & Science, Literacy & Language
4            Literacy & Language, Math & Science
6               Math & Science, Applied Learning
7                               Applied Learning
8                            Literacy & Language
10                                Math & Science...

В каждой строке есть значения, разделенные запятыми. То, что я хочу, это подсчитать наличие всех уникальных ценностей. Например: Math & Science появляется 4 раза. Таким образом, счет по математике и естественным наукам должен быть 4. Я попробовал следующий код:

cato=response['Category'].str.split(',')
cat_set=[]
for i in cato.dropna():
    cat_set.extend(i)
plt1=pd.Series(cat_set).value_counts().sort_values(ascending=False).to_frame()

Но проблема в том, что этот код работает для небольших наборов данных, но для большого набора данных требуется много времени. Какие-нибудь решения для этого?

Спасибо

Ответы [ 4 ]

0 голосов
/ 09 мая 2018
split = response['Category'].str.split(', ')

s = set()
for row in split:
    [s.add(el) for el in row]

for topic in s:    
    df[topic] = a.map(lambda x: topic in x)

Это приводит к df с

                                       0  Literacy & Language  Math & Science  \
0  Applied Learning, Literacy & Language                 True           False   
1     Literacy & Language, Special Needs                 True           False   
2    Math & Science, Literacy & Language                 True            True   
3    Literacy & Language, Math & Science                 True            True   
4       Math & Science, Applied Learning                False            True   
5                       Applied Learning                False           False   
6                    Literacy & Language                 True           False   
7                         Math & Science                False            True   

   Applied Learning  Special Needs  
0              True          False  
1             False           True  
2             False          False  
3             False          False  
4              True          False  
5              True          False  
6             False          False  
7             False          False  

Чтобы можно было вычислить сумму значений True:

for topic in s:
    print(topic, df[topic].sum())

Literacy & Language 5
Math & Science 4
Applied Learning 3
Special Needs 1
0 голосов
/ 09 мая 2018

Это один из способов использования collections.Counter и itertools.chain. Особое внимание необходимо уделить устранению пробелов.

Для повышения производительности вы должны протестировать и сравнить свои данные.

from collections import Counter
from itertools import chain

s = pd.Series(['Applied Learning, Literacy & Language', 'Literacy & Language, Special Needs',
               'Math & Science, Literacy & Language', 'Literacy & Language, Math & Science',
               'Math & Science, Applied Learning', 'Applied Learning', 'Literacy & Language',
               'Math & Science'])

res = Counter(map(str.strip, chain.from_iterable(s.str.split(','))))

Counter({'Applied Learning': 3,
         'Literacy & Language': 5,
         'Math & Science': 4,
         'Special Needs': 1})
0 голосов
/ 09 мая 2018

Другой способ использования scikit-learn -

from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer(tokenizer=lambda x: [i.strip() for i in x.split(',')], lowercase=False)
counts = vec.fit_transform(df['text']) # actual count, output will be a sparse matrix
dict(zip(vec.get_feature_names(), counts.sum(axis=0).tolist()[0]))

Здесь модуль CountVectorizer представляет собой реализацию scikit-learn для моделирования любого пакета слов в обработке естественного языка.

Вы можете использовать объект counts непосредственно как разреженную матрицу, эффективную для хранения и вычисления, вы также можете выполнять такие операции, как .sum(axis=0), которые суммируются по столбцам. После этого просто объедините его с vocabulary, чтобы получить то, что вы хотите

выход

{'Applied Learning': 3, 'Literacy & Language': 5, 'Math & Science': 4, 'Special
Needs': 1}

Это относится ко всем словам в этом столбце

0 голосов
/ 09 мая 2018

Попробуйте использовать collections.Counter, который создан специально для высокой производительности таких задач, как эта.

Скажем, вы начинаете с

df = pd.DataFrame({'Category': ['Applied Learning, Literacy & Language', 'Literacy & Language, Special Needs']})

тогда делай

import collections
import itertools
>>> collections.Counter(itertools.chain.from_iterable(v.split(',') for v in df.Category))

Counter({' Literacy & Language': 1,
         ' Special Needs': 1,
         'Applied Learning': 1,
         'Literacy & Language': 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...