Мой текущий фрейм данных:
Name term Grade
0 A 1 35
1 A 2 40
2 B 1 50
3 B 2 45
Я хочу получить фрейм данных как:
Name term Grade
0 A 1 35
2 40
1 B 1 50
2 45
Могу ли я получить ожидаемый результат? Если да, то как я могу это сделать?





Используйте duplicated для логической маски с numpy.where:
mask = df['Name'].duplicated()
#more general
#mask = df['Name'].ne(df['Name'].shift()).cumsum().duplicated()
df['Name'] = np.where(mask, '', df['Name'])
print (df)
Name term Grade
0 A 1 35
1 2 40
2 B 1 50
3 2 45
Возможная разница между масками видна в измененном DataFrame:
print (df)
Name term Grade
0 A 1 35
1 A 2 40
2 B 1 50
3 B 2 45
4 A 4 43
5 A 3 46
Если несколько одинаковых последовательных групп, например 2 группы A, нуждаются в общем решении:
mask = df['Name'].ne(df['Name'].shift()).cumsum().duplicated()
df['Name'] = np.where(mask, '', df['Name'])
print (df)
Name term Grade
0 A 1 35
1 2 40
2 B 1 50
3 2 45
4 A 4 43
5 3 46
mask = df['Name'].duplicated()
df['Name'] = np.where(mask, '', df['Name'])
print (df)
Name term Grade
0 A 1 35
1 2 40
2 B 1 50
3 2 45
4 4 43
5 3 46
Мне просто любопытно ... по какой причине вы выбираете здесь подход mask / np.where вместо чего-то вроде:
df.loc[df.Name.duplicated(), 'Name'] = ''?