1

这里是一个相当初级的熊猫问题。

我有一个交易数据框:

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. 对于每个客户,他们最大(金额)交易的日期和金额。

你能告诉我适当的代码吗?

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

4

2 回答 2

0

我认为 aDataFrame对于您的数据来说是一个很好的结构。每当您设置“拆分-应用-组合”分析步骤集时,您都可以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.

未经我的手机测试!

于 2013-08-08T21:21:24.867 回答
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

我对此很满意,除了“礼物”列,我敢肯定它没有以最优雅的方式实现。

于 2013-08-09T15:22:10.650 回答