#python #pandas
#python #pandas
Вопрос:
У меня есть следующий фрейм данных:
df = pd.DataFrame({'Tipo': ['A','A','B','B','B','C','B','A','C','B','A','A','A','A','A','A','A','C','B','B','A']})
Type
0 A
1 A
2 B
3 B
4 B
5 C
6 B
7 A
8 C
9 B
10 A
11 A
12 A
13 A
14 A
15 A
16 A
17 C
18 B
19 B
20 A
Цель состоит в том, чтобы создать новый столбец «Rep», который подсчитывает непрерывные строки, которые повторяют значения первого, например:
Type Rep
0 A 2
1 A 2
2 B 3
3 B 3
4 B 3
5 C 1
6 B 1
7 A 1
8 C 1
9 B 1
10 A 7
11 A 7
12 A 7
13 A 7
14 A 7
15 A 7
16 A 7
17 C 1
18 B 2
19 B 2
20 A 1
Я нашел способ идентифицировать индекс значений, но мне нужно изменить номера hem ino, чтобы это сработало, и я не знаю, как сгенерировать столбец rep:
df.loc[df['Type'] == 'B', 'Type'] = 2
mask = df == 2
index_type = mask.type[mask.type].index.values
Вывод:
[2 3 4 6 9 18 19]
Ответ №1:
Создайте последовательные группы, сравнив Series
созданные Series.shift
для не равных по Series.ne
с накопительной суммой Series.cumsum
и последним использованием Series.map
с Series.value_counts
:
g = df['Type'].ne(df['Type'].shift()).cumsum()
df['Rep'] = g.map(g.value_counts())
Или GroupBy.transform
для подсчета:
df['Rep'] = g.groupby(g).transform('size')
print (df)
Type Rep
0 A 2
1 A 2
2 B 3
3 B 3
4 B 3
5 C 1
6 B 1
7 A 1
8 C 1
9 B 1
10 A 7
11 A 7
12 A 7
13 A 7
14 A 7
15 A 7
16 A 7
17 C 1
18 B 2
19 B 2
20 A 1
Подробные сведения:
print (g)
0 1
1 1
2 2
3 2
4 2
5 3
6 4
7 5
8 6
9 7
10 8
11 8
12 8
13 8
14 8
15 8
16 8
17 9
18 10
19 10
20 11
Name: Type, dtype: int32