查询 Pandas 数据框
Query to Pandas dataframe
我有以下数据:
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
具有最大值的两个条目来确定两个最大的 PrimaryName
s.
例如,对于PN0
,两个最大值是5和6,对于PN1
,是6和7,对于PN2
,是2和3。这意味着最大的PrimaryName
是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 中重复它,特别是 pandas。
到目前为止,我只想到了查询的以下部分:
df.groupby('PrimaryName')[['PrimaryName', 'Value']]
我怀疑要像我在 C# 行中所做的那样执行计算 g.OrderByDescending(e => e.Value).Take(2).Sum(e => e.Value)
我将不得不定义一个带有临时列的新数据框,但我不确定具体如何。
有人可以帮我吗?
这个问题其实有点多。这个任务是关于 pandas 的课程的一部分,并且根据 groupby
是下周的主题这一事实来判断,我可能走错了路,或者至少我可能会遗漏一些东西简单明了。
使用双 nlargest
- 首先获取 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
或:
L = df.sort_values('Value', ascending=False)
.groupby('PrimaryName')['Value']
.apply(lambda x: x.head(2).sum())
.nlargest(2)
.index
.tolist()
你可以
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
我有以下数据:
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
具有最大值的两个条目来确定两个最大的 PrimaryName
s.
例如,对于PN0
,两个最大值是5和6,对于PN1
,是6和7,对于PN2
,是2和3。这意味着最大的PrimaryName
是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 中重复它,特别是 pandas。
到目前为止,我只想到了查询的以下部分:
df.groupby('PrimaryName')[['PrimaryName', 'Value']]
我怀疑要像我在 C# 行中所做的那样执行计算 g.OrderByDescending(e => e.Value).Take(2).Sum(e => e.Value)
我将不得不定义一个带有临时列的新数据框,但我不确定具体如何。
有人可以帮我吗?
这个问题其实有点多。这个任务是关于 pandas 的课程的一部分,并且根据 groupby
是下周的主题这一事实来判断,我可能走错了路,或者至少我可能会遗漏一些东西简单明了。
使用双 nlargest
- 首先获取 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
或:
L = df.sort_values('Value', ascending=False)
.groupby('PrimaryName')['Value']
.apply(lambda x: x.head(2).sum())
.nlargest(2)
.index
.tolist()
你可以
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