При использовании Pandas groupby, как мне запустить следующую группу при выполнении значения столбца?

#python #pandas #group-by

#python #pandas #группировка по

Вопрос:

У меня есть фрейм данных со столбцом внутри него, который называется «Current_Position»…Я хочу разделить фрейм данных на группы в любое время, когда значение «Current_Position» равно 0…Я хочу, чтобы строка, в которой встречается 0, была последней строкой текущей группы. Следующая строка запустит следующую группу. Как мне это сделать?

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

Ожидаемый результат:

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

Комментарии:

1. Вы что-нибудь пробовали? Вы могли бы просто перебирать значения, верно?

2. Rob — Добро пожаловать в Stack Overflow. Я полагаю, что я ответил на ваш вопрос, поэтому, пожалуйста, установите флажок рядом с моим решением, если оно дает ожидаемый результат.

Ответ №1:

Вы можете использовать логическую индексацию для возврата True или False , если строка равна нулю. Чтобы сделать ее последней в группе, используйте .shift() для сдвига одной строки. Затем возьмите .cumsum() , чтобы получить группы:

 df['Group'] = (df['Current_Position'].shift() == 0).cumsum()
df
Out[1]: 
    Current_Position  Group
0                  2      0
1                  4      0
2                  2      0
3                  0      0
4                  2      1
5                  0      1
6                  2      2
7                  0      2
8                  1      3
9                  2      3
10                 0      3
11                 2      4
12                 1      4
13                 0      4
14                 1      5
15                 2      5
16                 1      5
17                 0      5
18                 1      6
19                 0      6
  
  1. Мы привыкли .shift() сдвигать данные вниз на одну строку. Это позволяет строкам со 0 значениями быть последней строкой группы, а не первой.
  2. Мы использовали == 0 для преобразования Group в логический тип данных, который возвращает либо True или False . Значения в логическом ряду по существу эквивалентны 1 or 0 , поэтому вы можете использовать .cumsum() sum их для других математических операций над ним. Вы не смогли бы выполнить эти математические операции, если бы, например, мы создали столбец с object типом данных, который возвращает 'True' или 'False' СТРОКИ с чем-то вроде `df[‘Group’] = np.где (df[‘Current Position’] == 0, ‘True’, ‘False’).

Ниже приведена разбивка логики на три этапа, чтобы ее можно было легко визуализировать:

 df['Group1'] = df['Current_Position'].shift()
df['Group2'] = (df['Group1'] == 0)
df['Group3'] = df['Group2'] .cumsum()
df
Out[2]: 
    Current_Position  Group1  Group2  Group3
0                  2     NaN   False       0
1                  4     2.0   False       0
2                  2     4.0   False       0
3                  0     2.0   False       0
4                  2     0.0    True       1
5                  0     2.0   False       1
6                  2     0.0    True       2
7                  0     2.0   False       2
8                  1     0.0    True       3
9                  2     1.0   False       3
10                 0     2.0   False       3
11                 2     0.0    True       4
12                 1     2.0   False       4
13                 0     1.0   False       4
14                 1     0.0    True       5
15                 2     1.0   False       5
16                 1     2.0   False       5
17                 0     1.0   False       5
18                 1     0.0    True       6
19                 0     1.0   False       6