2015-01-09 2 views
1

У меня есть следующие панды DataFrame:Python, использование «заказ на» внутри «группы CONCAT» с пандами 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 

но я не знаю, как group_concat с Pandas DataFrame, а также как использовать порядок и лимит внутри group_concat.

ответ

1

В python/pandas нет функции concat для группы, поэтому нам нужно будет использовать некоторую группу. Это немного длиннее, чем SQL, но все еще относительно короткое (основная часть - 3 строки).

Давайте создадим dataframe:

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 

Первый шаг: мы сортирует dataframe по продажам:

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 

Второй шаг: мы используем групповую операцию. Для каждой категории она создаст список из двух верхних категорий. Данные по-прежнему целые.

df = df.groupby('category').apply(lambda x: list(x.product_id)[:2]) 
print df 

результат:

category 
cat1   [23, 98] 
cat2  [65, 798] 
dtype: object 

Если вам нужно иметь результат в виде строки, мы используем простую операцию лямбда:

df.apply(lambda x: '&'.join([str(elem) for elem in x])) 

результат:

category 
cat1   23&98 
cat2  65&798 
dtype: object