Предположим, у меня есть следующий фрейм данных:
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
в виде строки или целого числа в результате.