Python pandas dataframe groupby 选择列
Posted
技术标签:
【中文标题】Python pandas dataframe groupby 选择列【英文标题】:Python pandas dataframe groupby selecting columns 【发布时间】: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
你能帮帮我吗?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于Python pandas dataframe groupby 选择列的主要内容,如果未能解决你的问题,请参考以下文章
python pandas dataframe 写入hdfs