[英]Pandas: assign mean values to a category
我的數據包括發票和客戶。 一個客戶可以有多張發票。 一張發票始終屬於一個客戶。 發票每天更新(報告日期)。
我想計算每個客戶的所有發票之間的過帳日期的平均間隔(見下面的列)。
更簡單地解釋一下:我想知道每個客戶在他/她收到的發票的過帳日期之間的平均間隔(以天為單位)。
Report Date Invoice No Customer No Posting Date Mean-Interval (days)
2018-08-14 A 1 2018-08-05 3,5
2018-08-14 B 1 2018-08-10 3,5
2018-08-14 C 2 2018-08-01 15
2018-08-15 A 1 2018-08-05 3,5
2018-08-15 B 1 2018-08-10 3,5
2018-08-15 C 2 2018-08-01 15
2018-08-16 C 2 2018-08-01 15
2018-08-16 D 1 2018-08-12 3,5
2018-08-16 E 2 2018-08-16 15
因此,客戶 1 在 2018-08-05 收到發票 A,在 2018-08-10 收到發票 B,在 2018-08-12 收到發票 D。
所有收到發票日期之間的平均間隔為:(5+2)/2 = 3,5 天
我編寫的代碼計算發布日期之間的平均間隔(按“發票編號”分組)。
但它只對一個特定的客戶沒有“A”。 但是,我需要為每個客戶計算並分配到如上所示的表中。
從技術上講,我可以用 for 循環解決這個問題。 但是對於大約 20k 客戶,這將花費太長時間。
dateMean = df[df["Customer No"] == "A"].sort_values(by='Posting Date').groupby('Invoice No', sort=False)\
.agg({'Posting Date': 'first'})["Posting Date"]
dateMean.diff().mean()
Out: Timedelta('3 days 12:00:00')
請記住,可以在同一日期創建多個發票。 這就是為什么我總是將發票的第一個日期與另一個過帳日期的發票進行比較。
sort
和drop_duplicates
以獲取唯一發票。 然后我們可以計算平均時間差並將結果映射回原始。
import pandas as pd
#df['Report Date'] = pd.to_datetime(df['Report Date'])
#df['Posting Date'] = pd.to_datetime(df['Posting Date'])
cols = ['Customer No', 'Invoice No']
df1 = df.sort_values(cols).drop_duplicates(cols)
# `m` so diff is only within user.
m = df1['Customer No'].eq(df1['Customer No'].shift())
# `s`: Series of average time diff, index is Customer No
s = df1['Posting Date'].diff().where(m).dt.days.groupby(df1['Customer No']).mean()
df['Mean-Interval (days)'] = df['Customer No'].map(s)
print(df)
Report Date Invoice No Customer No Posting Date Mean-Interval (days)
0 2018-08-14 A 1 2018-08-05 3.5
1 2018-08-14 B 1 2018-08-10 3.5
2 2018-08-14 C 2 2018-08-01 15.0
3 2018-08-15 A 1 2018-08-05 3.5
4 2018-08-15 B 1 2018-08-10 3.5
5 2018-08-15 C 2 2018-08-01 15.0
6 2018-08-16 C 2 2018-08-01 15.0
7 2018-08-16 D 1 2018-08-12 3.5
8 2018-08-16 E 2 2018-08-16 15.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.