Вы можете попробовать этот бит кода вместо прямой группы:
country = [] #initialising lists
count = []
for i, g in df.groupby([(df.country != df.country.shift()).cumsum()]): #Creating a list that increases by 1 for every time a unique value appears in the dataframe country column.
country.append(g.country.tolist()[0]) #Adding the name of country to list.
count.append(len(g.country.tolist())) #Adding the number of times that country appears to list.
pd.DataFrame(data = {'country': country, 'count':count}) #Binding the lists all into a dataframe.
Этот df.groupby([(df.country != df.country.shift()).cumsum()])
создает фрейм данных, который присваивает уникальный номер (совокупно) каждой смене страны в столбце страны.
В цикле for i
представляет уникальный совокупный номер, присваиваемый каждому виду страны, а g
представляет соответствующую полную строку (и) из вашего исходного кадра данных.
g.country.tolist()
выводит список названий стран для каждого уникального вида (он же i
), т. е.
['india']
['USA']
['Russia']
['USA', 'USA']
для заданных вами данных.
Следовательно, первым элементом является название страны идлина представляет количество появлений.Затем эта информация может быть (записана в список, а затем) объединена в информационный кадр и выдать требуемый результат.
Вы также можете использовать список пониманий вместо цикла for:
cumulative_df = df.groupby([(df.country != df.country.shift()).cumsum()]) #The cumulative count dataframe
country = [g.country.tolist()[0] for i,g in cumulative_df] #List comprehension for getting country names.
count = [len(g.country.tolist()) for i,g in cumulative_df] #List comprehension for getting count for each country.
Ссылка: Pandas DataFrame: Как группировать последовательные значения