создание нового столбца путем слияния имени столбца и другого значения столбца - PullRequest
0 голосов
/ 02 мая 2018

Попытка создать новый столбец в DF1, в котором указано количество домашних команд allstars за этот год.

DF1

                     Date             Visitor  V_PTS                  Home  H_PTS  \
0 2012-10-30 19:00:00  Washington Wizards     84   Cleveland Cavaliers     94   
1 2012-10-30 19:30:00    Dallas Mavericks     99    Los Angeles Lakers     91   
2 2012-10-30 20:00:00      Boston Celtics    107            Miami Heat    120   
3 2012-10-31 19:00:00    Dallas Mavericks     94             Utah Jazz    113   
4 2012-10-31 19:00:00   San Antonio Spurs     99  New Orleans Pelicans     95   

   Attendance                    Arena                 Location  Capacity  \
0       20562      Quicken Loans Arena          Cleveland, Ohio     20562   
1       18997           Staples Center  Los Angeles, California     18997   
2       20296  American Airlines Arena           Miami, Florida     19600   
3       17634  Vivint Smart Home Arena     Salt Lake City, Utah     18303   
4       15358     Smoothie King Center   New Orleans, Louisiana     16867   

  Yr Arena Opened   Season  
0            1994  2012-13  
1            1992  2012-13  
2            1999  2012-13  
3            1991  2012-13  
4            1999  2012-13 

DF2

                           2012-13  2013-14  2014-15  2015-16  2016-17
Cleveland Cavaliers           1        1        2        1        3
Los Angeles Lakers            2        1        1        1        0
Miami Heat                    3        3        2        2        1
Chicago Bulls                 2        1        2        2        1
Detroit Pistons               0        0        0        1        1
Los Angeles Clippers          2        2        2        1        1
New Orleans Pelicans          0        1        1        1        1
Philadelphia 76ers            1        0        0        0        0
Phoenix Suns                  0        0        0        0        0
Portland Trail Blazers        1        2        2        0        0
Toronto Raptors               0        1        1        2        2

DF1['H_Allstars']=DF2[DF1['Season'],DF1['Home']])

приводит к TypeError: объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать

Я понимаю ошибку, просто не знаю, как еще это сделать.

Ответы [ 2 ]

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

Я удалил лишние столбцы и просто сосредоточился на необходимых для демонстрации.

Введите:

df1

                      Home  2012-13  2013-14  2014-15  2015-16  2016-17
0      Cleveland Cavaliers        1        1        2        1        3
1       Los Angeles Lakers        2        1        1        1        0
2               Miami Heat        3        3        2        2        1
3            Chicago Bulls        2        1        2        2        1
4          Detroit Pistons        0        0        0        1        1
5     Los Angeles Clippers        2        2        2        1        1
6     New Orleans Pelicans        0        1        1        1        1
7       Philadelphia 76ers        1        0        0        0        0
8             Phoenix Suns        0        0        0        0        0
9   Portland Trail Blazers        1        2        2        0        0
10         Toronto Raptors        0        1        1        2        2

df2

              Visitor                  Home   Season
0  Washington Wizards   Cleveland Cavaliers  2012-13
1    Dallas Mavericks    Los Angeles Lakers  2012-13
2      Boston Celtics            Miami Heat  2012-13
3    Dallas Mavericks             Utah Jazz  2012-13
4   San Antonio Spurs  New Orleans Pelicans  2012-13

Шаг 1: Растопить df1, чтобы получить столбец allstars

df3 = pd.melt(df1, id_vars='Home', value_vars = df1.columns[df.columns.str.contains('20')], var_name = 'Season', value_name='H_Allstars')

Ouput:

                      Home   Season   H_Allstars
0      Cleveland Cavaliers  2012-13           1
1       Los Angeles Lakers  2012-13           2
2               Miami Heat  2012-13           3
3            Chicago Bulls  2012-13           2
4          Detroit Pistons  2012-13           0
5     Los Angeles Clippers  2012-13           2
6     New Orleans Pelicans  2012-13           0
7       Philadelphia 76ers  2012-13           1
8             Phoenix Suns  2012-13           0
...

Шаг 2. Объедините этот новый фрейм данных с df2, чтобы получить столбцы H_Allstars и V_Allstars

df4 = pd.merge(df2, df3, how='left', on=['Home', 'Season'])

Выход:

              Visitor                  Home   Season  H_Allstars
0  Washington Wizards   Cleveland Cavaliers  2012-13         1.0
1    Dallas Mavericks    Los Angeles Lakers  2012-13         2.0
2      Boston Celtics            Miami Heat  2012-13         3.0
3    Dallas Mavericks             Utah Jazz  2012-13         NaN
4   San Antonio Spurs  New Orleans Pelicans  2012-13         0.0

Шаг 3: добавить столбец V_Allstars

# renaming column as required
df3.rename(columns={'Home': 'Visitor', 'H_Allstars': 'V_Allstars'}, inplace=True)

df5 = pd.merge(df4, df3, how='left', on=['Visitor', 'Season'])

Выход:

              Visitor                  Home   Season  H_Allstars  V_Allstars
0  Washington Wizards   Cleveland Cavaliers  2012-13         1.0         NaN
1    Dallas Mavericks    Los Angeles Lakers  2012-13         2.0         NaN
2      Boston Celtics            Miami Heat  2012-13         3.0         NaN
3    Dallas Mavericks             Utah Jazz  2012-13         NaN         NaN
4   San Antonio Spurs  New Orleans Pelicans  2012-13         0.0         NaN
0 голосов
/ 02 мая 2018

Вы можете использовать pandas.melt. Переведите ваши данные df2 в длинный формат, то есть дом и сезон в виде столбцов, а Allstars - в значения, а затем объедините их с df1 в «Дом» и «Сезон».

import pandas as pd
df2['Home'] = df2.index
df2 = pd.melt(df2, id_vars = 'Home', value_vars = ['2012-13',  '2013-14', '2014-15', '2015-16', '2016-17'], var_name = 'Season', value_name='H_Allstars')
df = df1.merge(df2, on=['Home','Season'], how='left') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...