如何按列分组并计算其他列中的类别数?

2024-04-23 23:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

    name        tags
0   abc (1990)  AB|A|BC
1   def (2000)  BC|AB
2   yz (1990)   A|AB

tags列中的值是管道分隔的。此外,列name中的值的格式类似于description (year)。我想计算每年的标签数量,得到一个Series对象,如下所示:

year    
1990  A     2
      AB    2
      BC    1
2000  AB    1
      BC    1

或其等价物作为DataFrame

    year    tags    count
0   1990    A       2
1   1990    AB      2
2   1990    BC      1
3   2000    AB      1
4   2000    BC      1

我有一个解决方案,但是因为它涉及到定义一个自定义函数来传递给apply方法,我想知道是否存在更紧凑或有效的解决方案

以下是我目前的解决方案:

years = df['name'].str.slice(start=-5, stop=-1).rename('year')
new_df = df['tags'].str.split('|', expand=True).join(years)

def count_tags(g):
    return g.drop(columns=['year']).stack().value_counts()

new_df.groupby('year').apply(count_tags)

它给出:

year    
1990  A     2
      AB    2
      BC    1
2000  AB    1
      BC    1
dtype: int64

p.S.对我来说,year在结果中存储为字符串还是整数并不重要


Tags: 数据namedfnewabdefcounttags
1条回答
网友
1楼 · 发布于 2024-04-23 23:24:41

用途:

new_df = (df.assign(year=lambda x: x['name'].str[-5:-1])
            .set_index('year')['tags']
            .str.split('|', expand=True)
            .stack()
            .reset_index(name='tags')
            .groupby(['year','tags'])
            .size()
            .reset_index(name='count'))
print (new_df)

   year tags  count
0  1990    A      2
1  1990   AB      2
2  1990   BC      1
3  2000   AB      1
4  2000   BC      1

解释:

  1. 对于单行解决方案,首先使用^{}表示带切片的新列
  2. 对于索引由year使用^{}
  3. 然后用^{}表示数据帧,用^{}表示SeriesMultiIndex重塑
  4. 对于多索引中的列,添加^{}
  5. 列的Last^{}和aggregate^{},Last^{}

另一种解决方案:

from itertools import chain

tags = df['tags'].str.split('|')

df1 = pd.DataFrame({
    'tags' : list(chain.from_iterable(tags.values.tolist())), 
    'year' : df['name'].str[-5:-1].repeat(tags.str.len())
})

print (df1)
  tags  year
0   AB  1990
1    A  1990
2   BC  1990
3   BC  2000
4   AB  2000
5    A  1990
6   AB  1990

df2 = df1.groupby(['year','tags']).size().reset_index(name='count')
print (df2)
   year tags  count
0  1990    A      2
1  1990   AB      2
2  1990   BC      1
3  2000   AB      1
4  2000   BC      1

解释:

  1. ^{}创建列表
  2. ^{}获取列表的长度
  3. 最后^{}列和展开
  4. ^{}和聚合size

相关问题 更多 >