【问题标题】:Counting Words in a Column in a DataFrame计算 DataFrame 列中的字数
【发布时间】:2018-06-20 09:01:17
【问题描述】:

我有一个如下所示的 DataFrame:

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
  ...

列 (A-D) 与此任务无关。有没有办法在 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
  ...

【问题讨论】:

  • 为什么是 foo 2 和 bar 3?我认为这里是 2,而在您的示例中是 3。你有什么尝试吗?为什么会失败?
  • @Mr.T 我认为计数器会根据sID 重新启动。因此,对于sID 11,我们有 'I' (0)、'am' (1)、'foo' (2) 和 'bar' (3)。
  • 我不太明白你想要什么
  • 更新了原帖。

标签: python pandas dataframe counter


【解决方案1】:

在使用groupby("sID").cumcount() 之前,您需要进行一些操作以保持单词所在的行,一旦拆分,它们就属于。因此,您可以像这样创建列“计数器”:

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])))

你会得到预期的输出

【讨论】:

  • 正是我想要的。非常感谢!
【解决方案2】:

使用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.splitlen 计算字数。
  • 对每个组使用嵌套列表推导来恢复计数。
  • 使用itertools.chain 的链结果。

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 2023-02-06
    • 2020-09-12
    • 1970-01-01
    • 2022-11-10
    • 2018-06-17
    • 2014-09-05
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多