сгруппировать все результаты без обращения - PullRequest
0 голосов
/ 26 мая 2018

Сортировка в группе не работает так, как я думал.В следующем примере я не хочу группировать «США» вместе, потому что есть одна строка «Россия».

from io import StringIO

myst="""india, 905034 , 19:44   
USA, 905094  , 19:33
Russia,  905154 ,   21:56
USA, 345345, 45:55
USA, 34535, 65:45
"""
u_cols=['country', 'index', 'current_tm']

myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep=',', names = u_cols)

Когда я использую groupby, я получаю следующее:

df.groupby('country', sort=False).size()

country
india     1
USA       3
Russia    1
dtype: int64

Есть ли в любом случае, я могу получить результаты примерно так ...

country
india     1
USA       1
Russia    1
USA       2

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Использование трюка, указанного в комментарии @ user2285236

df['Group'] = (df.country != df.country.shift()).cumsum()
df.groupby(['country', 'Group'], sort=False).size()
0 голосов
/ 26 мая 2018

Вы можете попробовать этот бит кода вместо прямой группы:

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: Как группировать последовательные значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...