Подсчитайте отдельные слова из фрейма данных в python pandas

Я попытался разбить слова, а затем подсчитать их с помощью python pandas.

Исходные данные такие,

col_A 

happy, not happy
sad,happy
sad, happy
angry, happy
angry, sad

Я попытался использовать эту функцию для подсчета слов в col_A.

word_list= df.col_A.apply(lambda x: pd.value_counts(x.split(","))).sum(axis=0)

word_list.sort_values(ascending = False)

Это даст мне такие результаты, как,

angry       2
happy       2
sad         2
 happy      2
 not happy  1
 sad        1

Как я могу избежать этих пробелов, чтобы вернуть реальное количество значений?

Я хочу вернуть список, например,

happy      4
sad        3
angry      2
not happy  1

всегда ли есть столбец с двумя значениями? то есть формы value1, value2

Yuca 15.07.2019 20:13

Вы пробовали x.split(",").trim() или `x.split(",").strip() удалить лишние пробелы?

bkyada 15.07.2019 20:16

@Yuca Нет, некоторые строки дадут вам 3 или 4 значения. Не всегда 2. На самом деле чаще всего 3 значения.

Jiayu Zhang 15.07.2019 20:17

просто используйте .str.strip() в своей серии, и вы получите то, что хотите

Yuca 15.07.2019 20:17

@Yuca Я попробовал это, df.col_A.str.strip().apply(lambda x: pd.value_counts(x.split(","))).sum(axis=0), но результаты не изменились..

Jiayu Zhang 15.07.2019 20:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
556
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Попробуйте series.str.get_dummies(), а затем str.strip() столбцы и выполните groupby(axis=1).sum().sum():

m=df.col_A.str.get_dummies(',')
m.groupby(m.columns.str.strip(),axis=1).sum().sum()

angry        2
happy        4
not happy    1
sad          3
dtype: int64
df.col_A.str.replace(r"\s*,\s*", ",").str.get_dummies(",").sum() ?
MaxU - stop WAR against UA 15.07.2019 20:25

@MaxU, так лучше. К сожалению, я сейчас не в своей системе :(. Если хотите, вы можете опубликовать это как ответ :)

anky 15.07.2019 20:29

Пытаться

word_list= df.col_A.apply(lambda x: pd.value_counts([i.strip() for i in [x.split(",")]])).sum(axis=0)

Посмотрите, работает ли это

Спасибо @tawab_shakeel. Я отредактировал его. Может быть, это работает сейчас

MNK 15.07.2019 20:23

Пробелы мешали:

In [147]: word_list = df.col_A.apply(lambda x: pd.value_counts(x.replace(" ","").split(","))).sum(axis=0).sort_values(ascending 
     ...: = False)                                                                                                              

In [148]: word_list                                                                                                             
Out[148]: 
happy       4.0
sad         3.0
angry       2.0
nothappy    1.0
dtype: float64

Вот решение, очень похожее на решение @anky_91:

In [96]: df.col_A.str.replace(r"\s*,\s*", ",").str.get_dummies(",").sum()
Out[96]:
angry        2
happy        4
not happy    1
sad          3
dtype: int64

пошаговое решение

df = pd.DataFrame(data = {"col_A":["happy, not happy","sad,happy","sad, happy","angry, happy","angry, sad"]})

word_list= df.col_A.apply(lambda x: pd.value_counts(x.split(","))).sum(axis=0)

df = pd.DataFrame(word_list,columns=['count']).reset_index().rename(columns = {"index":"words"})

df['words'] = df['words'].str.strip()

df = df.groupby(['words']).sum().sort_values(by=['count'],ascending=[False]).reset_index()
    words      count
0   happy       4.0
1   sad         3.0
2   angry       2.0
3   not happy   1.0
Ответ принят как подходящий

Один лайнер, не ручаюсь за эффективность, но работает :)

pd.Series([x.strip() for x in df.col_A.str.split(',').sum()]).value_counts()

Выход:

happy        4
sad          3
angry        2
not happy    1

Проверка эффективности:

%timeit pd.Series([x.strip() for x in df.col_A.str.split(',').sum()]).value_counts()
1.19 ms ± 35.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.Series(sum([list(map(str.strip, i.split(','))) for i in df['col_A']], [])).value_counts()
1.13 ms ± 20.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

На самом деле метод доступа pandas .str очень медленный. Понимание списка почти всегда превосходит использование .str в pandas. +1

Scott Boston 15.07.2019 21:15

честный вопрос, тогда в чем узкое место? df.col_A.str.split()?

Yuca 15.07.2019 21:16

Да, ул.Сплит. Вместо этого вы могли бы использовать понимание списка и разделение строкового метода Python, и это было бы быстрее. Я думаю.

Scott Boston 15.07.2019 21:18

Вопрос новичка, ребята, вы говорите о разнице между df.col и df['col']?

Jiayu Zhang 15.07.2019 21:24

@JiayuZhang, насколько я понимаю, нет :)

Yuca 15.07.2019 21:31

@ScottBoston, не могли бы вы пролить свет на ваше предложение? Я пытаюсь следовать этому, но пока не получается

Yuca 15.07.2019 21:32
pd.Series(sum([list(map(str.strip, i.split(','))) for i in df['col_A']], [])).value_counts() в одну сторону.
Scott Boston 15.07.2019 21:35

Использование строковых методов python и понимание списка по сравнению с использованием методов доступа .str и pandas.

Scott Boston 15.07.2019 21:36

@ScottBoston обновил ответ, чтобы показать эффективность. Учитывая небольшую выборку, справедливо сказать, что вы были правы :)

Yuca 15.07.2019 21:38

Давайте использовать melt или stack с str.split и value_counts:

df['col_A'].str.split(r',\s?', expand=True).melt()['value'].value_counts()

или

df['col_A'].str.split(r',\s?', expand=True).stack().value_counts()

Выход:

happy        4
sad          3
angry        2
not happy    1
dtype: int64

Другие вопросы по теме