如何计算第二大值并在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