хорошо, это работает
id Name Age
0 1 Ram 12
1 1 Ram 10
2 2 Shyam 11
3 2 Yam 11
4 3 Ravi 23
5 3 Ravi 23
6 4 Harsh 34
7 4 Krish 54
df['Match'] = df.groupby('id').apply(lambda x: [' ','Name,Age'] if ((len(set(x.Name)) > 1) and (len(set(x.Age)) > 1)) else [' ','Age'] if len(set(x.Age)) > 1 else [' ','Name'] if ((len(set(x.Name)) > 1)) else [' ',' ']).reset_index(name='Match').apply(lambda x: pd.Series(x.Match), axis=1).stack().reset_index(drop=True)
Что происходит
pd.groupby
по идентификатору, а затем прямо, если условия для проверки, где имя и возраст разные или одинаковые. Шаги создают что-то вроде ниже
id Match
0 1 [ , Age]
1 2 [ , Name]
2 3 [ , ]
3 4 [ , Name,Age]
Далее просто откройте список и сложите их.
выход
id Name Age Match
0 1 Ram 12
1 1 Ram 10 Age
2 2 Shyam 11
3 2 Yam 11 Name
4 3 Ravi 23
5 3 Ravi 23
6 4 Harsh 34
7 4 Krish 54 Name,Age