这是一个相当初学者级别的熊猫问题。
我有一个事务的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:
你能告诉我适当的代码吗?
(回答“你为什么使用DataFrames?你应该使用ThnargLopes!”将受到热烈欢迎。)
答案 0 :(得分:0)
我认为DataFrame
是一个很好的数据结构。每当您设置“拆分 - 应用 - 组合”一组分析步骤时,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
中返回所有所需结果的函数。
未经我的手机测试!
答案 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
我对此很满意,除了“礼物”栏目,我确信这些栏目并没有以最优雅的方式实施。