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

如何计算第二大值并在Python中为其添加另一列,python,pandas,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=['

这是我的代码:

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.
secondmagest
变量还有一列名为
level_1

2.)当我将第二大变量与所有数据合并时,会合并三列
index
level\u 1
c1\u secondmaxist
,我只想要
c1\u secondmaxist

3.)当我将第二大变量与所有_数据合并时,所有_数据的行数加倍

合并前的形状:
(1000000251)
合并后的形状:
(200000251)

编辑:

输入:

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
IIUC您需要:

df.merge(df.groupby('id')['c1'].apply(lambda x : x.max()).reset_index().rename(columns={'c1':'c1_secondLargest'}),on='id')
或:


使用
nth
+
sort\u值

df['second_largest'] = df.sort_values(by='c1').groupby('id').transform('nth', -2)


索引对齐将得到的序列重新拟合到初始数据框中。

请提供示例输入数据和所需输出。基本上,我只想计算
features
变量中所有列的第二大值,并将其与名为
all_data
Wait的主数据框合并,我正在编辑问题完成,很抱歉@JohnZwinckIs的延迟您希望“Second-Maximum”实际上包含相同id中的最大值吗?那么为什么它被称为“secondmaxist”,或者您真的希望它包含34个id==1而不是您所写的75个?非常感谢,有一件事,我可以添加后缀而不是重命名所有列吗?实际上,我的主数据框有数百列。@johndoe您绝对可以:)您应该将此作为一个示例,并探索满足您条件的所有
merge
选项。祝你一切顺利。。!!等等,你的第一个答案只是计算
max
,我想要
secondmax
。让我试试第二种one@johndoe:这是根据您提供的示例输出,如果您想要sorry sorry@anky,可以稍微调整一下,我添加了错误的输出。不管怎么说,我觉得自己很愚蠢。谢谢你的回答:D对不起,我弄糊涂了。
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