Заменить значения из одного столбца в кадре данных - PullRequest
1 голос
/ 28 мая 2019

импорт панд как pd импортировать NumPy как NP импорт ast

pd.options.display.max_columns = 20

У меня есть сезон столбцов данных, который выглядит следующим образом (первые 20 записей):

      season
0     2006-07
1     2007-08
2     2008-09
3     2009-10
4     2010-11
5     2011-12
6     2012-13
7     2013-14
8     2014-15
9     2015-16
10    2016-17
11    2017-18
12    2018-19
13     Career
14     season
15    2018-19
16     Career
17     season
18    2017-18
19    2018-19

Он начинается с сезона и заканчивается карьерой. Я хочу заменить годы числами, начинающимися с 1 и заканчивающимися во время карьеры. Я хочу быть таким:

      season
0     1
1     2
2     3
3     4
4     5
5     6
6     7
7     8
8     9
9     10
10    11
11    12
12    13
13     Career
14     season
15    1
16     Career
17     season
18    1
19    2

Таким образом, счет должен сбрасываться каждый раз, когда в столбце есть сезон, и заканчиваться каждый раз, когда происходит карьера.

1 Ответ

5 голосов
/ 28 мая 2019

Создание последовательных групп по маске сравнения, созданной Series.isin со смещенными значениями с GroupBy.cumcount для счетчика:

s = df['season'].isin(['Career', 'season'])
df['new'] = np.where(s, df['season'], df.groupby(s.ne(s.shift()).cumsum()).cumcount() + 1)
print (df)
     season     new
0   2006-07       1
1   2007-08       2
2   2008-09       3
3   2009-10       4
4   2010-11       5
5   2011-12       6
6   2012-13       7
7   2013-14       8
8   2014-15       9
9   2015-16      10
10  2016-17      11
11  2017-18      12
12  2018-19      13
13   Career  Career
14   season  season
15  2018-19       1
16   Career  Career
17   season  season
18  2017-18       1
19  2018-19       2

Для замены столбца season:

s = df['season'].isin(['Career', 'season'])
df.loc[~s, 'season'] = df.groupby(s.ne(s.shift()).cumsum()).cumcount() + 1
print (df)
    season
0        1
1        2
2        3
3        4
4        5
5        6
6        7
7        8
8        9
9       10
10      11
11      12
12      13
13  Career
14  season
15       1
16  Career
17  season
18       1
19       2
...