Python,在 "group concat" 和 pandas DataFrame 中使用 "order by"

Python, use "order by" inside a "group concat" with pandas DataFrame

我有以下 Pandas DataFrame:

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.

中使用排序依据和限制

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 operation.For 每个类别,它将创建前两个类别的列表。数据仍然是整数。

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