如何计算第二大值并在Python中为其添加另一列

2024-10-03 02:42:50 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的密码:

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.)当我将第二大变量与所有数据合并时,会合并三列indexlevel_1c1_secondLargest,我只想要c1_secondLargest

3.)当我将第二大变量与所有\u数据合并时,所有\u数据的行数加倍。你知道吗

合并前形状:(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

Tags: 数据id密码dataindexalllevelfeatures
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

索引对齐将得到的序列放回初始数据帧。你知道吗

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

相关问题 更多 >