以四种不同方式聚合数据

时间:2013-08-08 21:16:14

标签: python pandas

这是一个相当初学者级别的熊猫问题。

我有一个事务的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)

我想从这些数据中创建四个DataFrame:

  1. 对于每位客户,客户名称,他们完成的交易次数以及这些交易金额的总和
  2. 为每位客户提供最近一次交易的日期和金额。
  3. 为每位客户提供首次交易的日期和金额。
  4. 为每位客户提供最大(金额)交易的日期和金额。
  5. 你能告诉我适当的代码吗?

    (回答“你为什么使用DataFrames?你应该使用ThnargLopes!”将受到热烈欢迎。)

2 个答案:

答案 0 :(得分:0)

我认为DataFrame是一个很好的数据结构。每当您设置“拆分 - 应用 - 组合”一组分析步骤时,Pandas都会表现出色。您可以编写一个函数,假设您只有一个客户并返回Series,就像您正在寻找的那样。

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

然后使用groupbyapply

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

但是,由于您的每个新DataFrames都是单个客户的摘要,因此我建议您编写一个可以在一个Series中返回所有所需结果的函数。

未经我的手机测试!

答案 1 :(得分: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

我对此很满意,除了“礼物”栏目,我确信这些栏目并没有以最优雅的方式实施。