Python,在 Pandas DataFrame 的“group concat”中使用“order by”
Posted
技术标签:
【中文标题】Python,在 Pandas DataFrame 的“group concat”中使用“order by”【英文标题】:Python, use "order by" inside a "group concat" with pandas DataFrame 【发布时间】:2015-03-07 14:43:22 【问题描述】:我有以下 Pandas 数据框:
product_id category number_of_purchase
23 cat1 18
65 cat2 19
66 cat1 4
98 cat1 9
998 cat1 1
798 cat2 8
我想从这个 DataFrame 中创建这个新的 DataFrame:
category url
cat1 65&23
cat2 65&8
(对于每个类别我要检索购买次数最多的 2 个项目)
在 mysql 中我会这样做:
select
category,
group_concat(product_id order by numbe_of_purchase desc limit2 separator '&')
from my_table
group by category
但我不知道如何使用 Pandas DataFrame 进行 group_concat 以及如何在 group_concat 中使用 order by 和 limit。
【问题讨论】:
【参考方案1】:python/pandas 中没有 group concat 函数,所以我们必须使用一些 groupby。比 SQL 长一点,但还是比较短(主要是 3 行)。
让我们创建数据框:
import pandas as pd
data = 'product_id': [23, 65, 66, 98, 998, 798],
'category': ['cat1', 'cat2', 'cat1', 'cat1', 'cat1', 'cat2'],
'number_of_purchase': [18,19,4,9,1,8]
df = pd.DataFrame(data)
print df
结果:
category number_of_purchase product_id
0 cat1 18 23
1 cat2 19 65
2 cat1 4 66
3 cat1 9 98
4 cat1 1 998
5 cat2 8 798
第一步:我们按销售额对数据框进行排序:
df = df.sort(columns='number_of_purchase', ascending=False)
df
结果:
category number_of_purchase product_id
1 cat2 19 65
0 cat1 18 23
3 cat1 9 98
5 cat2 8 798
2 cat1 4 66
4 cat1 1 998
第二步:我们使用 groupby 操作。对于每个类别,它将创建一个前两个类别的列表。数据仍然是整数。
df = df.groupby('category').apply(lambda x: list(x.product_id)[:2])
print df
结果:
category
cat1 [23, 98]
cat2 [65, 798]
dtype: object
如果您需要将结果作为字符串,我们使用简单的 lambda 操作:
df.apply(lambda x: '&'.join([str(elem) for elem in x]))
结果:
category
cat1 23&98
cat2 65&798
dtype: object
【讨论】:
以上是关于Python,在 Pandas DataFrame 的“group concat”中使用“order by”的主要内容,如果未能解决你的问题,请参考以下文章
python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引
Pandas DataFrame 作为函数的参数 - Python