【问题标题】:Query to Pandas dataframe查询 Pandas 数据框
【发布时间】: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


【解决方案1】:

使用双精度 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()

【讨论】:

    【解决方案2】:

    你可以

    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
    

    【讨论】:

    • 嗯,谢谢你,零,你的详尽解释!现在,多亏了你,我更好地理解了这些 pandas 函数!干杯!
    猜你喜欢
    • 2018-09-30
    • 2020-09-15
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多