gpt4 book ai didi

python - Pandas :通过第一次和最后一次出现来填充每一行

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:51 25 4
gpt4 key购买 nike

我的数据包括发票和客户。一个客户可以有多个发票。一张发票始终属于一个客户。发票每天更新(报告日期)。

我的目标是计算客户的天数(请参阅“天数”列)。为了实现这一点,我采用第一次出现的客户报告日期并计算与最后一次出现的报告日期的差值。

例如客户 1 出现在 08-14 到 08-15 之间。因此他/她是 1 天大。

Report Date  Invoice No   Customer No  Amount  Age in Days
2018-08-14 A 1 50$ 1
2018-08-14 B 1 100$ 1
2018-08-14 C 2 75$ 2

2018-08-15 A 1 20$ 1
2018-08-15 B 1 45$ 1
2018-08-15 C 2 70$ 2

2018-08-16 C 2 40$ 1
2018-08-16 D 3 100$ 0
2018-08-16 E 3 60$ 0

我解决了这个问题,但是效率很低,而且耗时太长。我的数据包含 2600 万行。下面我只计算了一位顾客的年龄。

# List every customer no
customerNo = df["Customer No"].unique()
customer_age = []

# Testing for one specific customer
testCustomer = df.loc[df["Customer No"] == customerNo[0]]
testCustomer = testCustomer.sort_values(by="Report Date", ascending=True)

first_occur = testCustomer.iloc[0]['Report Date']
last_occur = testCustomer.iloc[-1]['Report Date']
age = (last_occur - first_occur).days

customer_age.extend([age] * len(testCustomer))
testCustomer.loc[:,'Customer Age']=customer_age

有没有更好的办法解决这个问题?

最佳答案

使用groupby.transformfirstlast聚合:

grps = df.groupby('Customer No')['Report Date']    
df['Age in Days'] = (grps.transform('last') - grps.transform('first')).dt.days

[输出]

  Report Date Invoice No  Customer No Amount  Age in Days
0 2018-08-14 A 1 50$ 1
1 2018-08-14 B 1 100$ 1
2 2018-08-14 C 2 75$ 2
3 2018-08-15 A 1 20$ 1
4 2018-08-15 B 1 45$ 1
5 2018-08-15 C 2 70$ 2
6 2018-08-16 C 2 40$ 2
7 2018-08-16 D 3 100$ 0
8 2018-08-16 E 3 60$ 0

关于python - Pandas :通过第一次和最后一次出现来填充每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57270540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com