сгруппировать и суммировать два столбца и установить как один столбец в пандах - PullRequest
0 голосов
/ 23 июня 2018

У меня есть следующий фрейм данных:

import pandas as pd
data = pd.DataFrame()
data['Home'] = ['A','B','C','D','E','F']
data['HomePoint'] = [3,0,1,1,3,3]
data['Away'] = ['B','C','A','E','D','D']
data['AwayPoint'] = [0,3,1,1,0,0]

Я хочу сгруппировать по столбцам ['Home', 'Away'] и изменить имя на Team.Затем я хотел бы суммировать домашнюю и удаленную точки как имя в точках.

     Team      Points
      A           4
      B           0
      C           4
      D           1
      E           4
      F           3

Как я могу это сделать?Я пробовал другой подход, используя следующий пост: Ссылка

Но я не смог получить нужный мне формат.

Очень ценю ваш совет.

Спасибо

Zep.

Ответы [ 2 ]

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

Вы можете объединить попарно столбцы вашего входного фрейма данных. Тогда используйте groupby.sum.

# calculate number of pairs
n = int(len(df.columns)/2)+1)

# create list of pairwise dataframes
df_lst = [data.iloc[:, 2*i:2*(i+1)].set_axis(['Team', 'Points'], axis=1, inplace=False) \
          for i in range(n)]

# concatenate list of dataframes
df = pd.concat(df_lst, axis=0)

# perform groupby
res = df.groupby('Team', as_index=False)['Points'].sum()

print(res)

  Team  Points
0    A       4
1    B       0
2    C       4
3    D       1
4    E       4
5    F       3
0 голосов
/ 24 июня 2018

Простой способ - создать две новые серии, проиндексированные командами:

home = pd.Series(data.HomePoint.values, data.Home)
away = pd.Series(data.AwayPoint.values, data.Away)

Тогда результат, который вы хотите получить:

home.add(away, fill_value=0).astype(int)

Обратите внимание, что home + away не работает, потому что команда F никогда не отыгрывала, поэтому для них получился бы NaN. Поэтому мы используем Series.add() с fill_value=0.

Сложный способ - использовать DataFrame.melt():

goo = data.melt(['HomePoint', 'AwayPoint'], var_name='At', value_name='Team')
goo.HomePoint.where(goo.At == 'Home', goo.AwayPoint).groupby(goo.Team).sum()

Или с другой точки зрения:

ooze = data.melt(['Home', 'Away'])
ooze.value.groupby(ooze.Home.where(ooze.variable == 'HomePoint', ooze.Away)).sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...