#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
- Мы привыкли
.shift()
сдвигать данные вниз на одну строку. Это позволяет строкам со0
значениями быть последней строкой группы, а не первой. - Мы использовали
== 0
для преобразованияGroup
в логический тип данных, который возвращает либоTrue
илиFalse
. Значения в логическом ряду по существу эквивалентны1
or0
, поэтому вы можете использовать.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