Подсчет слов в столбце в фрейме данных

1

У меня есть DataFrames, как показано ниже:

DF1 =

 sID   token     A  B  C  D
  10    I am     a  f  g  h
  10    here     a  g  g  h
  10    whats    a  h  g  h
  10    going    a  o  g  h
  10    on       a  j  g  h
  10    .        a  f  g  h
  11    I am     a  f  g  h
  11    foo bar  a  f  g  h
  12    You are  a  f  g  h
  ...

Столбцы (AD) не имеют значения в отношении этой задачи. Есть ли способ добавить столбец счетчика, который подсчитывает слова (помеченные пробелом) в DataFrame. Эта колонка должна начинать подсчитывать количество токенов для каждого sID. Это означает, что он сбрасывается каждый раз при изменении значения sID.

Обычно я просто использовал DF.groupby("sID").cumcount() но это только подсчитывает количество строк для каждого sID.

Результат должен выглядеть так:

DF2 =

 sID   token     A  B  C  D   Counter
  10    I am     a  f  g  h    0 1
  10    here     a  g  g  h    2
  10    whats    a  h  g  h    3
  10    going    a  o  g  h    4
  10    on       a  j  g  h    5
  10    .        a  f  g  h    6
  11    I am     a  f  g  h    0 1
  11    foo bar  a  f  g  h    2 3
  12    You are  a  f  g  h    0 1
  ...
Теги:
pandas
dataframe
counter

2 ответа

3
Лучший ответ

Перед использованием groupby("sID").cumcount() вам нужно сделать некоторые манипуляции, чтобы сохранить строку, которую вы разделили, когда она разделена. Итак, вы можете создать столбец "Counter" следующим образом:

df['Counter']= (df.set_index('sID',append=True)['token']
                  .str.split(' ',expand=True).stack()
                  .groupby('sID').cumcount()
                  .groupby(level=0).apply(lambda x: ' '.join([str(i) for i in x])))

и вы получите ожидаемый результат

  • 1
    Именно то, что я хотел. Очень признателен!
3

Использование groupby + itertools:

from itertools import chain, count

df = pd.DataFrame({'sID': [10, 10, 10, 10, 10, 10, 11, 11, 12],
                   'token': ['I am', 'here', 'whats', 'going',
                             'on', '.', 'I am', 'foo bar', 'You are']})

def counter(df):
    for k, g in df.groupby('sID')['token']:
        c = count()
        lens = g.str.split().map(len)
        yield [' '.join([str(next(c)) for _ in range(n)]) for n in lens]

df['Counts'] = list(chain.from_iterable(counter(df)))

Результат

print(df)

   sID    token Counts
0   10     I am    0 1
1   10     here      2
2   10    whats      3
3   10    going      4
4   10       on      5
5   10        .      6
6   11     I am    0 1
7   11  foo bar    2 3
8   12  You are    0 1

объяснение

  • Инициализируйте счетчик itertools.count для каждой группы.
  • Разделить по пробелам и подсчитать количество слов через str.split и len.
  • Используйте вложенное понимание списка для каждой группы для восстановления счетчиков.
  • itertools.chain результат с использованием itertools.chain.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню