C# 对数据帧的查询
我有以下数据:C# 对数据帧的查询,c#,python,pandas,python-3.5,C#,Python,Pandas,Python 3.5,我有以下数据: Id | PrimaryName | SecondaryName | Value ---+-------------+---------------+------- 0 | PN0 | SN0 | 3 1 | PN0 | SN1 | 5 2 | PN0 | SN2 | 6 3 | PN1 | SN3 | 5 4 | PN1
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
as,hm,value,还有一列PrimaryName
。
我的任务是,通过只查看每个PrimaryName
值最大的两个条目,确定两个最大的PrimaryName
s
例如,对于PN0
两个最大值是5和6,对于PN1
是6和7,对于PN2
是2和3。这意味着最大的PrimaryName
s是PN0
,得分为11,而PN1
的得分为13。理想的结果只是一个有序的
PrimaryName
s=>['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,特别是熊猫来重复它
到目前为止,我只想到了一个问题的以下部分:
df.groupby('PrimaryName')[['PrimaryName', 'Value']]
我怀疑,要像我在这C行中那样执行计算,我必须定义一个带有临时列的新数据帧,但我不确定具体是如何定义的
谁能帮我一下吗
实际上,这个问题还有一点。这项任务是关于熊猫的课程的一部分,根据
groupby
是下一周的主题这一事实判断,我可能走错了路,或者至少我可能遗漏了一些简单而明显的东西。使用double-first获取2
顶级值,然后使用sum
首先计算它们,然后再计算另一个前2个索引值:
L = df.groupby('PrimaryName')['Value']
.apply(lambda x: x.nlargest(2).sum())
.nlargest(2)
.index
.tolist()
print (L)
['PN1', 'PN0']
详情:
print (df.groupby('PrimaryName')['Value'].apply(lambda x: x.nlargest(2).sum()))
PrimaryName
PN0 11
PN1 13
PN2 5
Name: Value, dtype: int64
或:
你可以
In [5181]: (df.groupby(['PrimaryName'])['Value']
.nlargest(2)
.sum(level=0)
.nlargest(2)
.index.tolist())
Out[5181]: ['PN1', 'PN0']
细节
In [5185]: df.groupby(['PrimaryName'])['Value'].nlargest(2)
Out[5185]:
PrimaryName
PN0 2 6
1 5
PN1 5 7
4 6
PN2 8 3
7 2
Name: Value, dtype: int64
In [5186]: df.groupby(['PrimaryName'])['Value'].nlargest(2).sum(level=0)
Out[5186]:
PrimaryName
PN0 11
PN1 13
PN2 5
Name: Value, dtype: int64
In [5187]: df.groupby(['PrimaryName'])['Value'].nlargest(2).sum(level=0).nlargest(2)
Out[5187]:
PrimaryName
PN1 13
PN0 11
Name: Value, dtype: int64
@事实上,我做到了:
['PN1','PN0']
好吧,谢谢你,Zero,谢谢你的详细解释!现在,多亏了你,我才能够更好地理解这些功能!干杯
In [5185]: df.groupby(['PrimaryName'])['Value'].nlargest(2)
Out[5185]:
PrimaryName
PN0 2 6
1 5
PN1 5 7
4 6
PN2 8 3
7 2
Name: Value, dtype: int64
In [5186]: df.groupby(['PrimaryName'])['Value'].nlargest(2).sum(level=0)
Out[5186]:
PrimaryName
PN0 11
PN1 13
PN2 5
Name: Value, dtype: int64
In [5187]: df.groupby(['PrimaryName'])['Value'].nlargest(2).sum(level=0).nlargest(2)
Out[5187]:
PrimaryName
PN1 13
PN0 11
Name: Value, dtype: int64