【问题标题】:Python pandas dataframe groupby selecting columnsPython pandas dataframe groupby 选择列
【发布时间】:2016-07-16 00:08:34
【问题描述】:

我有以下 detaframe bb:

bq_selection_id bq_balance  bq_market_id  bq_back_price
0         45094462     185.04       7278437           1.97
1         45094462     185.04       7278437           1.97
2         45094463     185.04       7278437           3.05
3         45094463     185.04       7278437           3.05
4         45094464     185.04       7278437           5.80
5         45094464     185.04       7278437           5.80
6         45094466     185.04       7278437         200.00
7         45094466     185.04       7278437         200.00
8         45094465     185.04       7278437            NaN
9         45094465     185.04       7278437            NaN

我想按“market_id”分组并取前两个最低的“bq_back_price”。我设法用

做到了这一点
bb.groupby('bq_market_id')['bq_back_price'].nsmallest(2)

问题是我缺少一些列,例如“bq_selection_id”、“bq_balance”和“bq_back_price”列没有名称。这就是我得到的

bq_market_id   
7278437       0    1.97
7278437       1    1.97

我想得到这样的东西

bq_selection_id bq_balance  bq_market_id  bq_back_price
0         45094462     185.04       7278437           1.97
1         45094462     185.04       7278437           1.97

你能帮帮我吗?

【问题讨论】:

    标签: python python-2.7 python-3.x pandas


    【解决方案1】:

    您可以通过indexes 使用merge

    print bb.groupby('bq_market_id')['bq_back_price'].nsmallest(2).reset_index(level=0, name='bq_back_price')
       bq_market_id  bq_back_price
    0       7278437           1.97
    1       7278437           1.97
    
    print pd.merge(bb[['bq_selection_id','bq_balance']],
                   bb.groupby('bq_market_id')['bq_back_price'].nsmallest(2).reset_index(level=0, name='bq_back_price'),
                   left_index=True,
                   right_index=True)
       bq_selection_id  bq_balance  bq_market_id  bq_back_price
    0         45094462      185.04       7278437           1.97
    1         45094462      185.04       7278437           1.97
    

    unutbu 删除了不错的答案,但我认为它作为我的答案更好:

    result = df.groupby('bq_market_id')['bq_back_price'].nsmallest(2)
    idx = result.index.get_level_values(-1)
    print(df.loc[idx])
    
       bq_selection_id  bq_balance  bq_market_id  bq_back_price
    0         45094462      185.04       7278437           1.97
    1         45094462      185.04       7278437           1.97
    

    【讨论】:

      【解决方案2】:

      追加一个新的“排名”列怎么样?

      bb['rank'] = bb.groupby(['bq_market_id'])['bq_back_price'].rank(ascending=True)
      

      之后,您可以过滤 bb 的最低 2 个价格(排名 1 和 2)。

      bb[bb['rank'] < 3]
      

      归功于:python pandas rank by column

      【讨论】:

      • 您可能需要添加 `method='first' 以确保每组中不超过 2 行的排名
      【解决方案3】:

      您可以先对bq_back_price 上的值进行排序,然后在每个组中取head(2)

      In [218]: df.sort_values('bq_back_price').groupby('bq_market_id').head(2)
      Out[218]:
         bq_selection_id  bq_balance  bq_market_id  bq_back_price
      0         45094462      185.04       7278437           1.97
      1         45094462      185.04       7278437           1.97
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多