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

时间:2019-01-19 04:25:13

标签: python pandas

这是我的代码:

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合并时,三列被合并indexlevel_1c1_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

2 个答案:

答案 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