Подсчитать все строковые значения в заданном столбце таблицы и сгруппировать их по третьему столбцу
У меня есть три столбца. таблица выглядит так:
ID. names tag
1. john. 1
2. sam 0
3. sam,robin. 1
4. robin. 1
Id: тип целое число Имена: строка типа Tag: тип целое число (всего 0,1)
Я хочу узнать, сколько раз каждое имя повторяется, сгруппированные по 0 и 1. Это должно быть сделано в python.
Ответ должен выглядеть так
0 1
John 23 12
Robin 32 10
sam 9 30
2 ответа
Решение
С помощью extractall
а также crosstab
:
s = df.names.str.extractall(r'(\w+)').reset_index(1, drop=True).join(df.tag)
pd.crosstab(s[0], s['tag'])
tag 0 1
0
john 0 1
robin 0 2
sam 1 1
Из-за характера вашего names
В столбце есть некоторая повторная обработка, которую необходимо выполнить, прежде чем вы сможете получить значения счетчиков. В случае вашего примера dataframe это может выглядеть примерно так:
my_counts = (df.set_index(['ID.', 'tag'])
# Get rid of periods and split on commas
.names.str.strip('.').str.split(',')
.apply(pd.Series)
.stack()
.reset_index([0, 1])
# rename column 0 for consistency, easier reading
.rename(columns={0: 'names'})
# Get value counts of names per tag:
.groupby('tag')['names']
.value_counts()
.unstack('tag', fill_value=0))
>>> my_counts
tag 0 1
names
john 0 1
robin 0 2
sam 1 1