以四种不同的方式聚合数据

2024-06-02 12:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个相当初级的问题。你知道吗

我有一个事务数据框架:

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)

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

  1. 对于每个客户,客户名称、他们完成了多少交易以及这些交易金额的总和
  2. 对于每个客户,其最近交易的日期和金额。你知道吗
  3. 对于每个客户,其第一笔交易的日期和金额。你知道吗
  4. 对于每个客户,其最大(金额方面)交易的日期和金额。你知道吗

你能告诉我合适的密码吗?你知道吗

(答案是“为什么要使用数据帧?你应该用ThnargLopes!”将受到热烈欢迎。)


Tags: 数据frank框架date客户etc交易customer
2条回答

好吧,我已经弄明白了。首先,我们创建一个事务字段,其中包含要求和的个数:

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

我对此很满意,除了“礼物”一栏,我确信这不是以最优雅的方式实现的。你知道吗

我认为DataFrame是一个很好的数据结构。每当您设置一组“split-apply-combine”的分析步骤时,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中返回所有所需的结果。你知道吗

未通过我的手机测试!

相关问题 更多 >