PythonPandas:找到第n个最大的,在平局时计数

2024-06-23 20:07:13 发布

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

在pandasDataFrame中,我想找到第n个最大值(按行,而不是按列),然后还想找到,如果有联系的话。我有兴趣找到前三名和最大的领带。注意,实际问题中有3列以上, e、 g.如果数据框如下所示:

    A B C
0   1 2 2
1   3 4 3
2   1 2 3

我想知道第n个最大值,以及是否存在联系,因此:

  • 第0行-第一大的是2个带平局的,第二大的是1个,没有第三大的
  • 第1排-第一大的是第4排,第3排第二大的是并列的,没有第三大的
  • 第2行-第一大3、第二大2、第三大1

按要求的预期产出:

   A  B  C  max1  max2  max3  tie1  tie2  tie3
0  1  2  2     2     1   NaN     1     0   NaN
1  3  4  3     4     3   NaN     0     1   NaN
2  1  2  3     3     2   1.0     0     0   0.0

Tags: 数据nan兴趣领带pandasdataframe平局max1max2
2条回答

使用:

#top N values
N = 3
#reshape to MultiIndex Series and counts values per index, sorting 
df1 = (df.stack()
         .groupby(level=0).value_counts()
         .sort_index(ascending=[True, False])
         .reset_index(level=1))
#counter level to MultiIndex for new columns names
s = df1.groupby(level=0).cumcount().add(1)
df1 = df1.set_index(s, append=True)
#filter topN rows
df1 = df1[s.le(N).values]
df1.columns=['max','tie']
#subtract 1 for correct tie
df1['tie'] -= 1
#reshape to df with MultiIndex
df1 = df1.unstack()
#flatten columns names
df1.columns = df1.columns.map(lambda x: f'{x[0]}{x[1]}')
#add to original
df2 = df.join(df1)
print (df2)
   A  B  C  max1  max2  max3  tie1  tie2  tie3
0  1  2  2   2.0   1.0   NaN   1.0   0.0   NaN
1  3  4  3   4.0   3.0   NaN   0.0   1.0   NaN
2  1  2  3   3.0   2.0   1.0   0.0   0.0   0.0
for i in range(len(df)):
    l = df.loc[0].tolist()
    d = {key: l.count(key) for key in l}

字典现在包含这些值以及在行中重复的次数。然后可以轻松打印字典的前n个值

相关问题 更多 >

    热门问题