2013-08-08 8 views
1

Здесь достаточно задать вопрос о панде.Агрегирование данных четырьмя различными способами

У меня есть DataFrame сделок:

Customer Date  Amount 
Angus 2009-07-18 $76.46 
Bruno 2009-07-21 $68.66 
Danno 2009-07-25 $73.52 
Chapp 2009-07-11 $56.04 
Chapp 2009-07-21 $11.30 
Frank 2009-07-07 $52.86 
Chapp 2009-07-09 $97.82 
Danno 2009-07-11 $84.98 
(etc. for thousands of lines) 

Я хотел бы создать четыре DataFrames из этих данных:

  1. Для каждого клиента, имя клиентов, сколько сделок они уже и суммы Сумм этих сделок
  2. Для каждого клиента указаны дата и сумма их последней транзакции.
  3. Для каждого клиента указаны дата и сумма их первой транзакции.
  4. Для каждого клиента - дата и сумма их наибольшей (суммарной) транзакции.

Можете ли вы посоветовать мне соответствующий код?

(ответы по линиям «Почему вы используете DataFrames? Вы должны использовать ThnargLopes для этого!» Будет тепло встречен.)

ответ

0

Я думаю DataFrame это большая структура для ваших данных. Всякий раз, когда вы настраиваете набор шагов анализа «split-apply-comb», Pandas превосходит. Вы можете написать функцию, предполагающую, что у вас есть только один клиент, и возвращает Series, как вы ищите.

import pandas as pd 
def trans_count(DF): 
    return pd.Series({'count': len(DF), 
        'total': sum(DF['Amount'])}) 

Затем используйте groupby и apply:

yourDF.groupby('Customer').apply(trans_count) 

Однако, поскольку каждый из вашего нового DataFrames это резюме одного клиента, я хотел бы предложить писать одну функцию, которая может вернуть все ваши желаемые результаты в одном Series.

непроверенный с моего телефона!

0

ОК, я понял это. Во-первых, мы делаем поле сделка те просуммировать:

df["Trans"] = len(df)*[1] 

Сгруппируем Заказчиком:

cust_gp = df.groupby("Customer") 

первым проще всего:

cust_gp.sum() 

Четыре также не сложно:

cust_gp.max() 

2 и 3 были сложными .. Я нашел решение, которое, похоже, работало с моими тестовыми данными. Сортировать данные по Клиенту и дате, то агрегат, взяв первый для каждого клиента:

df.sort(["Customer","Date"]).groupby("Customer").first() 
df.sort(["Customer","Date"]).groupby("Customer").last() 

... но когда я запустил его на моем большом наборе данных, мне сказали, что некоторые из моих последних транзакций взяли место до Последние транзакции. Это не имеет смысла.

Оказалось, что поле даты импортируется как текст! Таким образом, комплексное решение:

df.Date = pd.to_datetime(df.Date) # Date field should be date, not text 
df = df.sort(["Customer","Date"]) 
cust_gp = df.groupby("Customer") 

total_df  = cust_gp.sum() # 1 
largest_df = cust_gp.max() # 2 
first_df  = cust_gp.first() # 3 
last_df  = cust_gp.last() # 4 

Я доволен этим, в колонке «Подарки», который, я уверен, не будет реализован в наиболее элегантный способ кроме.

+0

Странно похожий на мой первый вопрос на этом сайте: http://stackoverflow.com/questions/9588331/simple-cross-tabulation-in-pandas –

+0

Множественные агрегатные функции! Я не знал об этом. Благодарю. –

+0

Yup - это была моя реакция - я знал, что это возможно - просто не мог пробиться сквозь множество доступных возможностей, чтобы понять, как ... Это фантастическая библиотека ... так рада, что я ее нашел –

Смежные вопросы