【发布时间】:2018-04-03 02:44:20
【问题描述】:
我有以下数据:
Id | PrimaryName | SecondaryName | Value
---+-------------+---------------+-------
0 | PN0 | SN0 | 3
1 | PN0 | SN1 | 5
2 | PN0 | SN2 | 6
3 | PN1 | SN3 | 5
4 | PN1 | SN4 | 6
5 | PN1 | SN5 | 7
6 | PN2 | SN6 | 1
7 | PN2 | SN7 | 2
8 | PN2 | SN8 | 3
实际上,它类似于键值对,以SecondaryName 为键,Value 为,嗯,值,附加列PrimaryName。
我的任务是,通过仅查看每个 PrimaryName 的最大值的两个条目,确定两个最大的 PrimaryNames。
例如,PN0 的两个最大值是 5 和 6,PN1 是 6 和 7,PN2 是 2 和 3。这意味着最大的 PrimaryNames 是 PN0得分为 11,PN1 得分为 13。
理想的结果只是PrimaryNames => ['PN1', 'PN0']
作为一个相当精通 C# 的人,这看起来很容易,可以通过以下查询来解决:
var result = table.GroupBy(r => r.PrimaryName)
.Select(g => new
{
PrimaryName = g.Key,
Value = g.OrderByDescending(e => e.Value).Take(2).Sum(e => e.Value)
})
.OrderByDescending(e => e.Value)
.Take(2)
.Select(e => e.PrimaryName)
.ToList();
但现在我必须在 Python 中重复一遍,特别是 pandas。
到目前为止,我只想到了查询的以下部分:
df.groupby('PrimaryName')[['PrimaryName', 'Value']]
我怀疑要像在此 C# 行 g.OrderByDescending(e => e.Value).Take(2).Sum(e => e.Value) 中那样执行计算,我将不得不定义一个带有临时列的新数据框,但我不确定具体如何。
有人可以帮我吗?
这个问题实际上还有更多内容。这个任务是熊猫课程的一部分,而且,从groupby 是下周的主题这一事实来看,我可能走错了路,或者至少我可能会错过一些简单而明显的东西。
【问题讨论】:
-
@Zero 实际上是:
['PN1', 'PN0']
标签: c# python pandas python-3.5