这是我的代码:
features = ['c1']
secondLargest = all_data.groupby(['Id'])[features].apply(
lambda x:x.nlargest(2,features)).reset_index()
all_data = pd.merge(all_data, secondLargest.reset_index(),
suffixes=["", "_secondLargest"], how='left', on=['Id'])
此代码的问题是:
1。)secondLargest
变量也有一个名为level_1
的列
2。)当我将secondLargest变量与all_data合并时,三列被合并index
,level_1
,c1_secondLargest
,而我只想要c1_secondLargest
3。)当我将secondLargest变量与all_data合并时,all_data的行数加倍。
合并前的形状:(1000000,251)
合并后的形状:(2000000,251)
编辑:
输入:
id c1
1 3
1 34
1 75
2 84
2 54
2 23
2 96
3 55
3 76
输出:
id c1 c1_secondLargest
1 3 34
1 34 34
1 75 34
2 84 84
2 54 84
2 23 84
2 96 84
3 55 55
3 76 55
答案 0 :(得分:2)
使用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
索引对齐将得到的序列取回并适合初始DataFrame。
答案 1 :(得分:1)
您需要的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