从pandas groupby中的每个组中选择前n个元素

t_tia

我有一个大致如下所示的数据框:

>>> data
    price currency    
id                
2    1050       EU
5    1400       EU
4    1750       EU
8    4000       EU
7     630      GBP
1    1000      GBP
9    1400      GBP
3    2000      USD
6    7000      USD 

我需要使用n每种货币的价格最高的商品获得一个新的数据框,该数据框n取决于货币,并在另一个数据框中给出:

>>> select_number
          number_to_select
currency       
GBP         2
EU          2
USD         1

如果必须选择相同数量的最昂贵元素,则可以按货币对数据进行分组pandas.groupby,然后使用head分组对象的方法。

但是,head仅接受数字,而不接受数组或某些表达式。

当然,我可以编写一个for循环,但是这样做会使我们非常笨拙且效率低下。

如何才能做到这一点呢?

耶斯列尔

您可以使用:

data = pd.DataFrame({'id': {0: 2, 1: 5, 2: 4, 3: 8, 4: 7, 5: 1, 6: 9, 7: 3, 8: 6}, 'price': {0: 1050, 1: 1400, 2: 1750, 3: 4000, 4: 630, 5: 1000, 6: 1400, 7: 2000, 8: 7000}, 'currency': {0: 'EU', 1: 'EU', 2: 'EU', 3: 'EU', 4: 'GBP', 5: 'GBP', 6: 'GBP', 7: 'USD', 8: 'USD'}})
select_number = pd.DataFrame({'number_to_select': {'USD': 1, 'GBP': 2, 'EU': 2}})
print (data)
  currency  id  price
0       EU   2   1050
1       EU   5   1400
2       EU   4   1750
3       EU   8   4000
4      GBP   7    630
5      GBP   1   1000
6      GBP   9   1400
7      USD   3   2000
8      USD   6   7000

print (select_number)
     number_to_select
EU                  2
GBP                 2
USD                 1

映射解决方案dict

d = select_number.to_dict()
d1 = d['number_to_select']
print (d1)
{'USD': 1, 'EU': 2, 'GBP': 2}

print (data.groupby('currency').apply(lambda dfg: dfg.nlargest(d1[dfg.name],'price'))
           .reset_index(drop=True))

  currency  id  price
0       EU   8   4000
1       EU   4   1750
2      GBP   9   1400
3      GBP   1   1000
4      USD   6   7000

解决方案2:

print (data.groupby('currency')
           .apply(lambda dfg: (dfg.nlargest(select_number
                                   .loc[dfg.name, 'number_to_select'], 'price')))
           .reset_index(drop=True))

   id  price currency
0   8   4000       EU
1   4   1750       EU
2   9   1400      GBP
3   1   1000      GBP
4   6   7000      USD

解释:

我认为对于调试而言,最佳的使用功能fprint

def f(dfg):
    #dfg is DataFrame 
    print (dfg)
    #name of group
    print (dfg.name)
    #select value from select_number  
    print (select_number.loc[dfg.name, 'number_to_select']) 
    #return top rows per groups 
    print (dfg.nlargest(select_number.loc[dfg.name, 'number_to_select'], 'price'))
    return (dfg.nlargest(select_number.loc[dfg.name, 'number_to_select'], 'price'))

print (data.groupby('currency').apply(f))
  currency  id  price
0       EU   2   1050
1       EU   5   1400
2       EU   4   1750
3       EU   8   4000
  currency  id  price
0       EU   2   1050
1       EU   5   1400
2       EU   4   1750
3       EU   8   4000
EU
2
  currency  id  price
3       EU   8   4000
2       EU   4   1750
  currency  id  price
4      GBP   7    630
5      GBP   1   1000
6      GBP   9   1400
GBP
2
  currency  id  price
6      GBP   9   1400
5      GBP   1   1000
  currency  id  price
7      USD   3   2000
8      USD   6   7000
USD
1
  currency  id  price
8      USD   6   7000

           currency  id  price
currency                      
EU       3       EU   8   4000
         2       EU   4   1750
GBP      6      GBP   9   1400
         5      GBP   1   1000
USD      8      USD   6   7000

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从pandas groupby中的每个组中选择前n个元素

来自分类Dev

如何从Pandas DataFrame中的每个组中选择具有最高值的N行

来自分类Dev

从pandas groupby对象中选择多个组

来自分类Dev

从 Pandas groupby 中获取前 N 个结果

来自分类Dev

在EntityFramework中的每个组中选择前n行

来自分类Dev

在EntityFramework中的每个组中选择前n行

来自分类Dev

将排名应用于Pandas Groupby中的每个组

来自分类Dev

删除groupby中不包含元素的组(Python Pandas)

来自分类Dev

删除groupby中不包含元素的组(Python Pandas)

来自分类Dev

从pandas groupby对象返回每个组的子集

来自分类Dev

Pandas 遍历 groupby 并绘制每个组

来自分类Dev

如何在pandas.groupby函数中为每个组创建一个数据框?

来自分类Dev

Pandas 从更大的数据集中随机选择 n 个组

来自分类Dev

Pandas-对groupby中的聚合列进行排序并过滤前n个列

来自分类Dev

Pandas GroupBy:如何基于列获取前n个值

来自分类Dev

使用PowerShell从每个组中选择前5个项目

来自分类Dev

Postgresql:如何从每个组/类别中选择前n个%(%)条目

来自分类Dev

在分组数据框中选择每个组的第n个元素

来自分类Dev

在分组数据框中选择每个组的第n个元素

来自分类Dev

从每个组中选择前n条记录

来自分类Dev

根据Groupby在Pandas中的列中的值从DataFrame中选择CONSECUTIVE行

来自分类Dev

Pandas groupby-将不同的功能应用于每个组中的一半记录

来自分类Dev

在pandas DataFrame中选择与一列的前两个不同项匹配的行

来自分类Dev

如何在Python3 Pandas中从每个月中选择最大日期

来自分类Dev

在 Pandas 多索引数据框中选择只有 1 个条目的元素

来自分类Dev

选择groupby中的前3个元素

来自分类Dev

Python Pandas每个组中组与组总计的值之比

来自分类Dev

Pandas - 在 groupby 之后从嵌套标题中选择多列

来自分类Dev

使用Python中的Pandas,为每个组选择最高价值的行

Related 相关文章

  1. 1

    从pandas groupby中的每个组中选择前n个元素

  2. 2

    如何从Pandas DataFrame中的每个组中选择具有最高值的N行

  3. 3

    从pandas groupby对象中选择多个组

  4. 4

    从 Pandas groupby 中获取前 N 个结果

  5. 5

    在EntityFramework中的每个组中选择前n行

  6. 6

    在EntityFramework中的每个组中选择前n行

  7. 7

    将排名应用于Pandas Groupby中的每个组

  8. 8

    删除groupby中不包含元素的组(Python Pandas)

  9. 9

    删除groupby中不包含元素的组(Python Pandas)

  10. 10

    从pandas groupby对象返回每个组的子集

  11. 11

    Pandas 遍历 groupby 并绘制每个组

  12. 12

    如何在pandas.groupby函数中为每个组创建一个数据框?

  13. 13

    Pandas 从更大的数据集中随机选择 n 个组

  14. 14

    Pandas-对groupby中的聚合列进行排序并过滤前n个列

  15. 15

    Pandas GroupBy:如何基于列获取前n个值

  16. 16

    使用PowerShell从每个组中选择前5个项目

  17. 17

    Postgresql:如何从每个组/类别中选择前n个%(%)条目

  18. 18

    在分组数据框中选择每个组的第n个元素

  19. 19

    在分组数据框中选择每个组的第n个元素

  20. 20

    从每个组中选择前n条记录

  21. 21

    根据Groupby在Pandas中的列中的值从DataFrame中选择CONSECUTIVE行

  22. 22

    Pandas groupby-将不同的功能应用于每个组中的一半记录

  23. 23

    在pandas DataFrame中选择与一列的前两个不同项匹配的行

  24. 24

    如何在Python3 Pandas中从每个月中选择最大日期

  25. 25

    在 Pandas 多索引数据框中选择只有 1 个条目的元素

  26. 26

    选择groupby中的前3个元素

  27. 27

    Python Pandas每个组中组与组总计的值之比

  28. 28

    Pandas - 在 groupby 之后从嵌套标题中选择多列

  29. 29

    使用Python中的Pandas,为每个组选择最高价值的行

热门标签

归档