Могу ли я объединить групповые данные? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть две колонны дома и в гостях.Таким образом, один ряд будет Англия против Бразилии, а следующий ряд будет Бразилия Англия.Как я могу посчитать случаи, когда Бразилия сталкивается с Англией или Англией против Бразилии в одном подсчете?

Основываясь на предыдущих решениях, я пытался

results.groupby(["home_team", "away_team"]).size()
results.groupby(["away_team", "home_team"]).size()

, однако это не дает мне результата, которыйЯ ищу.

Нежелательный вывод: home_team away_team
Англия Бразилия 1

away_team home_team
Бразилия Англия 1

Я хотел бы видеть: Англия Бразилия2

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Вы можете отсортировать значения по numpy.sort, создать DataFrame и использовать исходное решение:

df1 = (pd.DataFrame(np.sort(df[['home','away']], axis=1), columns=['home','away'])
        .groupby(["home", "away"])
        .size())
0 голосов
/ 13 июня 2018

Опция 1

Вы можете использовать numpy.sort для сортировки значений фрейма данных. Однако, поскольку это сортирует на месте, возможно, лучше создать копию фрейма данных.

dfTeams = pd.DataFrame(data=df.values.copy(), columns=['team1','team2'])
dfTeams.values.sort()

(я изменил имена столбцов, потому что с сортировкой вы меняете их значение)

После этого вы можете использовать groupby.

results.groupby(['team1', 'team2']).size()

Вариант 2

Поскольку более общий заголовок вашего вопроса будет выглядеть примерно так: как я могу посчитать комбинацию значений в нескольких столбцах на фрейме данных независимо от ихЗаказать , вы можете использовать set.

Объект набора - это неупорядоченная коллекция различных хеш-объектов.

Точнее, создайте Series замороженных наборов, а затем подсчитывайте значения.

pd.Series(map(lambda home, away: frozenset({home, away}), 
              df['home'], 
              df['away'])).value_counts()

Примечание. Я использую фрейм данных в ответе @Harv Ipan.

0 голосов
/ 13 июня 2018

Может быть, вам нужно ниже:

df = pd.DataFrame({
    'home':['England', 'Brazil', 'Spain'],
    'away':['Brazil', 'England', 'Germany']
})

pd.Series('-'.join(sorted(tup)) for tup in zip(df['home'], df['away'])).value_counts()

Вывод:

Brazil-England    2
Germany-Spain     1
dtype: int64

PS: Если вам не нравится - между названиями команд, вы можете использовать:

pd.Series(' '.join(sorted(tup)) for tup in zip(df['home'], df['away'])).value_counts()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...