Я попытался разбить слова, а затем подсчитать их с помощью 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
Вы пробовали x.split(",").trim() или `x.split(",").strip() удалить лишние пробелы?
@Yuca Нет, некоторые строки дадут вам 3 или 4 значения. Не всегда 2. На самом деле чаще всего 3 значения.
просто используйте .str.strip() в своей серии, и вы получите то, что хотите
@Yuca Я попробовал это, df.col_A.str.strip().apply(lambda x: pd.value_counts(x.split(","))).sum(axis=0), но результаты не изменились..






Попробуйте 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, так лучше. К сожалению, я сейчас не в своей системе :(. Если хотите, вы можете опубликовать это как ответ :)
Пытаться
word_list= df.col_A.apply(lambda x: pd.value_counts([i.strip() for i in [x.split(",")]])).sum(axis=0)
Посмотрите, работает ли это
Спасибо @tawab_shakeel. Я отредактировал его. Может быть, это работает сейчас
Пробелы мешали:
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
честный вопрос, тогда в чем узкое место? df.col_A.str.split()?
Да, ул.Сплит. Вместо этого вы могли бы использовать понимание списка и разделение строкового метода Python, и это было бы быстрее. Я думаю.
Вопрос новичка, ребята, вы говорите о разнице между df.col и df['col']?
@JiayuZhang, насколько я понимаю, нет :)
@ScottBoston, не могли бы вы пролить свет на ваше предложение? Я пытаюсь следовать этому, но пока не получается
pd.Series(sum([list(map(str.strip, i.split(','))) for i in df['col_A']], [])).value_counts() в одну сторону.
Использование строковых методов python и понимание списка по сравнению с использованием методов доступа .str и pandas.
@ScottBoston обновил ответ, чтобы показать эффективность. Учитывая небольшую выборку, справедливо сказать, что вы были правы :)
Давайте использовать 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
всегда ли есть столбец с двумя значениями? то есть формы
value1, value2