Это должно сделать трюк, data
- ваш исходный словарь, result
- ну, вы догадались правильно =)
def convert_to_float(num) :
try :
num = float(num)
except ValueError :
pass
return num
result = { convert_to_float(k) : convert_to_float(v) for k,v in data.items() }
IIUC вам нужно:
df.merge(df.groupby('id')['c1'].apply(lambda x : x.max()).reset_index().rename(columns={'c1':'c1_secondLargest'}),on='id')
или:
print(df.merge(df.groupby('id')['c1'].apply(lambda x : x.nlargest(1)).reset_index().rename(columns={'c1':'c1_secondLargest'}).drop('level_1',axis=1),on='id'))
id c1 c1_secondLargest
0 1 3 75
1 1 34 75
2 1 75 75
3 2 84 96
4 2 54 96
5 2 23 96
6 2 96 96
7 3 55 76
8 3 76 76
Используя nth
+ sort_values
df['second_largest'] = df.sort_values(by='c1').groupby('id').transform('nth', -2)
id c1 second_largest
0 1 3 34
1 1 34 34
2 1 75 34
3 2 84 84
4 2 54 84
5 2 23 84
6 2 96 84
7 3 55 55
8 3 76 55
Индексное выравнивание берет полученную серию и помещает ее обратно в исходный фрейм данных.